En este hilo, miramos ejemplos de buenos usos de goto
en C o C ++. Esta inspirado por una respuesta que la gente votó porque pensaron que estaba bromeando.
Resumen (la etiqueta cambió 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:
- Es específico.
goto
es la construcción del lenguaje que causa una rama incondicional. Las alternativas dependen del uso de estructuras que soporten ramas condicionales, con una condición degenerada siempre verdadera. - La etiqueta documenta la intención sin comentarios adicionales.
- El lector no tiene que escanear el código intermedio para los primeros
break
s (aunque todavía es posible que un pirata informático sin principios simulecontinue
con uno tempranogoto
).
Reglas:
- Finge que los gotophobes no ganaron. Se entiende que lo anterior no se puede usar en código real porque va en contra del lenguaje establecido.
- Supongamos que todos hemos oído hablar de 'Goto considerado dañino' y sabemos que goto se puede usar para escribir código espagueti.
- Si no está de acuerdo con un ejemplo, critíquelo únicamente por sus méritos técnicos ("Porque a la gente no le gusta goto" no es una razón técnica).
Veamos si podemos hablar de esto como adultos.
Editar
Esta pregunta parece haber terminado ahora. Generó algunas respuestas de alta calidad. Gracias a todos, especialmente a aquellos que se tomaron en serio mi pequeño ejemplo de bucle. La mayoría de los escépticos estaban preocupados por la falta de alcance de bloque. Como @quinmars señaló en un comentario, siempre puede colocar llaves alrededor del cuerpo del bucle. Noto de paso eso for(;;)
y while(true)
tampoco le doy las llaves gratis (y omitirlas puede causar errores molestos). De todos modos, no desperdiciaré más tu poder mental en esta bagatela: puedo vivir con lo inofensivo y lo idiomático for(;;)
y while(true)
(igual de bien si quiero mantener mi trabajo).
Considerando las otras respuestas, veo que muchas personas ven goto
como algo que siempre hay que reescribir de otra manera. Por supuesto, puede evitarlo goto
introduciendo un bucle, una bandera adicional, una pila de mensajes de correo if
electrónico anidados o lo que sea, pero ¿por qué no considerar si goto
es quizás la mejor herramienta para el trabajo? Dicho de otra manera, ¿cuánta fealdad están dispuestas a soportar las personas para evitar usar una función de lenguaje incorporada para el propósito previsto? Mi opinión es que incluso agregar una bandera es un precio demasiado alto a pagar. Me gusta que mis variables representen cosas en los dominios de problemas o soluciones. 'Solo para evitar un goto
' no es suficiente.
Aceptaré la primera respuesta que dio el patrón C para ramificar a un bloque de limpieza. En mi opinión, este es el caso más sólido para una goto
de todas las respuestas publicadas, ciertamente si lo mides por las contorsiones que tiene que atravesar un enemigo para evitarlo.