En este hilo, veremos ejemplos de buenos usos de goto
en C o C++. Está inspirado en una respuesta que la gente votó porque pensaban que estaba bromeando.
Resumen (etiqueta cambiada del original para que la intención sea aún más clara):
infinite_loop:
// code goes here
goto infinite_loop;
Por qué es mejor que las alternativas:
goto
es la
construcción del lenguaje que provoca una
bifurcación incondicional. Las alternativas
dependen del uso de estructuras
que soporten ramas condicionales,
con una condición
degenerada.rupturas
tempranas
(aunque sigue siendo posible que un
hacker sin escrúpulos simular
continue
con un goto
temprano).Reglas:
A ver si podemos hablar de esto como adultos.
Edit
Esta pregunta parece haber terminado. Ha generado algunas respuestas de gran calidad. Gracias a todos,
especialmente a los que se tomaron en serio mi pequeño ejemplo del bucle. La mayoría de los escépticos estaban preocupados
por la falta de ámbito de bloque. Como @quinmars señaló en un comentario, siempre se puede poner llaves alrededor de la
cuerpo del bucle. Observo de paso que for(;;)
y while(true)
tampoco te dan las llaves
de forma gratuita (y omitirlos puede causar errores molestos). De todos modos, no voy a malgastar más
puedo vivir con los inofensivos e idiomáticos for(;;)
y while(true)
(igual de bien si quiero conservar mi trabajo).
Considerando las otras respuestas, veo que mucha gente ve goto
como algo que siempre tienes que reescribir de otra manera.
tienes que reescribir de otra manera. Por supuesto, puedes evitar un goto
introduciendo un bucle,
una bandera extra, una pila de if
s anidados, o lo que sea, pero ¿por qué no considerar si goto
es quizás la mejor herramienta para el trabajo?
la mejor herramienta para el trabajo? Dicho de otro modo, ¿cuánta fealdad está dispuesta a soportar la gente para evitar el uso de una función integrada en el lenguaje para el fin previsto? Mi opinión es que
incluso añadir una bandera es un precio demasiado alto. Me gusta que mis variables representen cosas en
Sólo para evitar un goto
' no me vale.
I'll aceptar la primera respuesta que dio el patrón de C para la ramificación a un bloque de limpieza. OMI, este es el caso más fuerte para un goto
de todas las respuestas publicadas, ciertamente
si lo mides por las contorsiones que un hater tiene que hacer para evitarlo.
He aquí mi ejemplo no tonto, (de Stevens APITUE) para llamadas al sistema Unix que pueden ser interrumpidas por una señal.
restart:
if (system_call() == -1) {
if (errno == EINTR) goto restart;
// handle real errors
}
La alternativa es un bucle degenerado. Esta versión se lee como Inglés "si la llamada al sistema fue interrumpido por una señal, reiniciarlo".
No tengo nada en contra de los gotos en general, pero se me ocurren varias razones por las que no querrías usarlos para un bucle como el que mencionas: