O que há de errado em usar o goto?

Duplicatas possíveis:
Por que é ruim usar o goto?
GOTO ainda considerado prejudicial?

Eu estava passando por xkcd e vi este (se também ler alguns textos negativos sobre eles há alguns anos):
sua conexão lenta é uma droga, consiga uma mais rápida para ver essa imagem
O que está realmente errado com isso? Por que o goto é mesmo possível em C ++?

Por que eu não deveria usá-los?

Porque eles levam ao código de espaguete .

No passado, as linguagens de programação não tinham while () if () etc, e os programadores usavam goto para compor a lógica de seus programas. Isso leva a uma bagunça inamovível.

É por isso que os deuses da CS criaram condicionais e loops de funções. A programação estruturada foi uma revolução na época.

goto’s são apropriados em alguns lugares, como para saltar de loops nesteds

Nada está errado com goto se for usado corretamente. A razão pela qual é “tabu” é porque nos primeiros dias de C, os programadores (geralmente vindos de um background de assembly) usavam o goto para criar um código incrivelmente difícil de entender.

Na maioria das vezes, você pode viver sem goto e ficar bem. Existem alguns exemplos, no entanto, em que goto pode ser útil. O principal exemplo é um 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 um goto para saltar de um loop profundamente nested pode ser mais limpo do que usar uma variável de condição e verificá-la em todos os níveis.

Usar o goto para implementar as sub-rotinas é a principal forma de abuso. Isso cria o chamado "código espaguete", que é desnecessariamente difícil de ler e manter.

Não há nada errado com goto em si mesmo. É uma construção muito útil em programação e tem muitos usos válidos. O melhor que vem à mente é a liberação estruturada de resources em programas em C.

Onde goto vai mal é quando eles são abusados. Abuso de gotos pode levar a códigos completamente ilegíveis e inamovíveis.

Em 1968, Edsger Dijkstra escreveu uma carta famosa para o editor de Comunicações do ACM GOTO é considerado prejudicial em que ele expôs o caso para a programação estruturada com loops while e se … então … outras condicionais. Quando o GOTO é usado para replace essas estruturas de controle, o resultado é, com muita frequência, código de espaguete . Quase todas as linguagens de programação usadas atualmente são uma linguagem de programação estruturada e o uso de GOTOs foi praticamente eliminado. Na verdade, Java, Scala, Ruby e Python não possuem um comando goto .

C, C ++ e Perl ainda têm um comando GOTO, e há situações (em particular C) onde um GOTO é útil , por exemplo uma instrução break que sai de múltiplos loops, ou como uma forma de concentrar o código de limpeza em um único lugar uma function, mesmo quando existem várias maneiras de terminar a function (por exemplo, retornando códigos de erro em vários pontos no progresso de uma function). Mas geralmente seu uso deve ser restrito a padrões de design específicos que o exigem de maneira controlada e reconhecida.

(Em C ++, é melhor usar RAII ou ScopeGuard (mais) em vez de usar GOTO para limpeza. Mas GOTO é um idioma frequentemente usado no kernel Linux ( outra fonte ) que é um ótimo exemplo de código C idiomático.)

O quadrinho XKCD é uma piada sobre a questão “O GOTO deve sempre ser considerado prejudicial quando existem certos padrões específicos de design que são grandemente ajudados pelo seu uso?”

Você pesquisou no Google?

O fundador do movimento anti-goto é Edsger Dijskstra com seu lendário “Goto Considered Nocivo”

Para você começar, você pode ir (ha ha!) http://en.wikipedia.org/wiki/GOTO

É possível em C ++, porque é possível em C. Se você deve ou não deve usá-lo é uma guerra religiosa de longa data.