215 votes

Qu'y a-t-il de mal à utiliser goto ?

Duplicatas possibles :
Pourquoi est-ce mauvais d'utiliser goto ?
GOTO est toujours considéré comme nuisible ?

Je parcourais xkcd et j'ai vu celui-ci (si j'ai aussi lu des textes négatifs à leur sujet il y a quelques années) :
your slow connection sucks, get a faster one to see this image
Qu'est-ce qui ne va pas en réalité ? Pourquoi les goto's sont-ils même possibles en C++ alors ?

Pourquoi devrais-je pas les utiliser ?

58 votes

I d

2 votes

T b

10 votes

T

159voto

Byron Whitlock Points 29863

Parce qu'ils conduisent à code spaghetti .

Dans le passé, les langages de programmation n'avaient pas de boucles while, d'instructions if, etc., et les programmeurs utilisaient le goto pour créer la logique de leurs programmes. Cela conduisait à un désordre impossible à maintenir.

C'est pourquoi les dieux du CS ont créé les méthodes, les conditionnels et les boucles. Structuré La programmation était une révolution à l'époque.

Les goto sont appropriés à certains endroits, par exemple pour sortir de boucles imbriquées.

29 votes

Les sauts de boucles imbriquées sont les suivants sólo J'ai utilisé des instructions de type "goto" dans certains cas. Même dans ce cas, je remanie mon code pour qu'il revienne plus tôt lorsque c'est possible.

126 votes

+1 pour avoir reconnu que goto a encore une raison d'être en de rares occasions.

1 votes

Je me souviens avoir lu que les gotos sont souvent utilisés par certains outils qui génèrent automatiquement du code, comme les générateurs d'analyseurs, etc.

103voto

bta Points 22525

Il n'y a rien de mal à goto s'il est utilisé correctement. La raison pour laquelle il est "tabou" est qu'aux premiers jours du C, les programmeurs (qui venaient souvent d'un milieu assembleur) utilisaient goto pour créer un code incroyablement difficile à comprendre.

La plupart du temps, vous pouvez vivre sans goto et être bien. Il y a cependant quelques cas où goto peut être utile. Le meilleur exemple est un cas comme celui-ci :

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:

Utilisation d'un goto pour sortir d'une boucle profondément imbriquée peut souvent être plus propre que d'utiliser une variable de condition et de la vérifier à chaque niveau.

Utilisation de goto pour mettre en œuvre des sous-programmes est le principal moyen d'en abuser. Cela crée ce qu'on appelle du "code spaghetti", inutilement difficile à lire et à maintenir.

5 votes

Que se passe-t-il s'il y a des objets automatiques construits sur la pile, qui sont locaux à l'intérieur de la boucle ? Goto se rendra à un autre endroit, en sautant par-dessus la fin des blocs, où les destructeurs de ces objets sont appelés. C'est bien cela ? Dans la plupart des cas, cela ne fera rien de mal. Mais il y a des cas où cela fera quelque chose, y compris la perte de données de l'utilisateur, etc.

16 votes

@SasQ : Le compilateur est chargé de veiller à ce que l'instruction "jmp" générée pour l'instruction "jmp" soit bien la même que celle générée pour l'instruction "jmp". goto est précédé du code nécessaire pour se débarrasser des variables internes.

3 votes

Il n'est pas vrai que goto peut passer d'une fonction à l'autre. C a longjmp() pour cela, et le C++ a des exceptions.

46voto

JaredPar Points 333733

Il n'y a pas de problème avec le goto en soi. C'est une construction très utile en programmation et elle a de nombreuses utilisations valables. La meilleure qui me vient à l'esprit est la libération structurée des ressources dans les programmes C.

C'est lorsqu'on abuse des goto's que les choses tournent mal. L'abus de goto peut conduire à un code complètement illisible et non maintenable.

33voto

Ken Bloom Points 27197

En 1968, Edsger Dijkstra a écrit une célèbre lettre au rédacteur en chef de Communications de l'ACM GOTO est considéré comme nuisible dans laquelle il a exposé les arguments en faveur de la programmation structurée avec boucles while et si...alors...autrement conditionnelles. Lorsque GOTO est utilisé pour remplacer ces structures de contrôle, le résultat est très souvent code spaghetti . La quasi-totalité des langages de programmation utilisés aujourd'hui sont des langages de programmation structurés, et l'utilisation des GOTO a été pratiquement éliminée. En fait, Java, Scala, Ruby et Python n'ont pas de GOTO. goto du tout.

Le C, le C++ et le Perl disposent toujours d'une commande GOTO, et il existe des situations (en C en particulier) où une commande GOTO peut être utilisée. GOTO est utile Par exemple, une instruction break qui sort de plusieurs boucles, ou comme moyen de concentrer le code de nettoyage à un seul endroit dans une fonction même s'il existe plusieurs façons de terminer la fonction (par exemple, en renvoyant des codes d'erreur à plusieurs moments de la progression d'une fonction). Mais en général, son utilisation doit être limitée à des modèles de conception spécifiques qui l'exigent de manière contrôlée et reconnue.

(En C++, il est préférable d'utiliser un RAII ou un ScopeGuard (plus) au lieu d'utiliser GOTO pour le nettoyage. Mais GOTO est un idiome fréquemment utilisé dans le noyau Linux ( une autre source ) qui est un excellent exemple de code C idiomatique).

La bande dessinée XKCD est une blague sur la question suivante : "Le GOTO doit-il toujours être considéré comme nuisible alors que certains modèles de conception spécifiques sont grandement favorisés par son utilisation ?".

7 votes

Et que les GOTO ont disparu avec les dinosaures (informatiques)

0 votes

@Gerry : c'est une bonne idée. Je n'y avais pas pensé.

0 votes

En fait, avec la goto il a utilisé (pour goto une sorte de sous-programme), les rapaces devraient l'attaquer.

10voto

John Smith Points 4266

Avez-vous googlé le problème ?

Le fondateur du mouvement anti-goto est Edsger Dijskstra avec son légendaire "Goto Considered Harmful".

Pour commencer, vous pouvez (ha ha !) http://en.wikipedia.org/wiki/GOTO

2 votes

Ironiquement, il tolérait beaucoup plus de GOTO que les programmeurs d'aujourd'hui. Pour Djikstra, le GOTO avant est acceptable, le GOTO arrière et le GOTO à l'intérieur de la boucle ne le sont pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X