¿Qué hay de malo con el uso de goto?

Posibles duplicados:
¿Por qué es malo usar goto?
GOTO todavía se considera perjudicial?

Estaba recorriendo xkcd y vi este (si también leí algunos textos negativos sobre ellos hace algunos años):
su conexión lenta es una mierda, obtenga una más rápida para ver esta imagen
¿Qué está realmente mal con eso? ¿Por qué son incluso posibles en C ++?

¿Por qué no debería usarlos?

Porque conducen al código de spaghetti .

En el pasado, los lenguajes de progtwigción no tenían while () if () etc, y los progtwigdores usaban goto para completar la lógica de sus progtwigs. Lleva a un lío inmanejable.

Es por eso que los dioses CS crearon funciones condicionales y bucles. La progtwigción estructurada fue una revolución en ese momento.

Los goto son apropiados en algunos lugares, como para saltar desde bucles nesteds

No pasa nada con goto si se usa correctamente. La razón por la cual es “tabú” es porque en los primeros días de C, los progtwigdores (a menudo provenientes de un entorno de ensamblaje) usaban goto para crear código increíblemente difícil de entender.

La mayoría de las veces, puedes vivir sin goto y estar bien. Sin embargo, hay algunas instancias en las que goto puede ser útil. El mejor ejemplo es un caso como:

 for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 1000; k++) { ... if (condition) goto break_out; .... } } } break_out: 

Usar un goto para saltar de un bucle profundamente nested a menudo puede ser más limpio que usar una variable de condición y verificarla en todos los niveles.

El uso de goto para implementar subrutinas es la principal forma de abuso. Esto crea el llamado "código spaghetti" que es innecesariamente difícil de leer y mantener.

No hay nada malo con goto en sí mismo. Es una construcción muy útil en la progtwigción y tiene muchos usos válidos. Lo mejor que se me ocurre es la liberación estructurada de recursos en los progtwigs C.

Donde van mal los errores es cuando son abusados. El abuso de gotos puede llevar a un código completamente ilegible e inmanejable.

En 1968, Edsger Dijkstra escribió una famosa carta al editor de Comunicaciones del ACM GOTO se considera dañina, en la que expuso el caso de la progtwigción estructurada con while loops y si … entonces … else condicional. Cuando GOTO se utiliza para sustituir estas estructuras de control, el resultado es muy a menudo el código de espagueti . Casi todos los lenguajes de progtwigción en uso hasta el día son un lenguaje de progtwigción estructurado, y el uso de GOTO ha sido prácticamente eliminado. De hecho, Java, Scala, Ruby y Python no tienen un comando goto en absoluto.

C, C ++ y Perl aún tienen un comando GOTO, y hay situaciones (en C particularmente) donde un GOTO es útil , por ejemplo, una statement de interrupción que sale de múltiples bucles, o como una forma de concentrar el código de limpieza en un solo lugar en una función incluso cuando hay múltiples formas de terminar la función (por ejemplo, devolviendo códigos de error en múltiples puntos en el progreso de una función). Pero, en general, su uso debe restringirse a patrones de diseño específicos que lo requieran de una manera controlada y reconocida.

(En C ++, es mejor usar RAII o ScopeGuard (más) en lugar de usar GOTO para la limpieza, pero GOTO es una expresión de uso frecuente en el kernel de Linux ( otra fuente ) que es un gran ejemplo de código C idiomático).

El comic de XKCD es una broma sobre la pregunta “¿Debería GOTO siempre ser considerado dañino cuando hay ciertos patrones de diseño específicos que son de gran ayuda por su uso?”

¿Google el problema?

El fundador del movimiento anti-goto es Edsger Dijskstra con su legendario “Goto Considerado Dañino”

Para comenzar, puede ir a (ja, ja!) http://en.wikipedia.org/wiki/GOTO

Es posible en C ++ porque es posible en C. Si deberías o no deberías usarlo es una guerra religiosa de larga data.