web-dev-qa-db-fra.com

Quel est le problème avec l'utilisation de goto?

Doublons possibles:
Pourquoi est-il mauvais d'utiliser goto?
GOTO toujours considéré comme dangereux?

J'étais à travers xkcd et j'ai vu celui-ci (si vous avez 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
Quel est le problème avec cela? Pourquoi est-ce que goto est même possible en C++ alors?

Pourquoi devrais-je pas les utiliser?

96
user142019

Parce qu'ils mènent au code spaghetti .

Dans le passé, les langages de programmation n'avaient pas while () if (), etc., et les programmeurs utilisaient goto pour composer la logique de leurs programmes. Cela a conduit à un désordre intenable.

C'est pourquoi les dieux CS ont créé des fonctions conditionnelles et des boucles. La programmation structurée a été une révolution à l'époque.

les goto sont appropriées dans quelques endroits, comme pour sauter des boucles imbriquées

95
Byron Whitlock

Rien ne va pas avec goto s'il est utilisé correctement. La raison pour laquelle il est "tabou" est qu’au début du C, les programmeurs (souvent issus d’un contexte d’Assemblée) utilisaient goto pour créer un code incroyablement difficile à comprendre.

La plupart du temps, vous pouvez vivre sans goto et tout va bien. Cependant, il existe quelques cas où goto peut être utile. Le premier exemple est un cas tel que:

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:

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

Utiliser goto pour implémenter des sous-routines est le moyen principal utilisé pour en abuser. Cela crée ce qu'on appelle le "code spaghetti" qui est inutilement difficile à lire et à maintenir.

58
bta

Il n'y a rien de mal à goto en soi. C'est une construction très utile en programmation et a de nombreuses utilisations valables. Le meilleur qui me vienne à l’esprit est la libération structurée des ressources dans les programmes C.

Là où les choses vont mal, c'est quand ils sont maltraités. L'abus de gotos peut conduire à un code totalement illisible et incontrôlable.

32
JaredPar

En 1968, Edsger Dijkstra écrivit une célèbre lettre au rédacteur en chef de Communications de l'ACMGOTO est considéré comme dangereux dans laquelle il exposa cas pour la programmation structurée avec tandis que boucles et if ... then ... else conditionals. Lorsque GOTO est utilisé pour remplacer ces structures de contrôle, le résultat est très souvent code spaghetti . Quasiment tous les langages de programmation utilisés de nos jours sont des langages de programmation structurés, et l’utilisation de GOTO a été pratiquement éliminée. En fait, Java, Scala, Ruby et Python n'ont pas de commande goto.

C, C++ et Perl ont toujours une commande GOTO, et il existe des situations (en C particulièrement) où un GOTO est utile , par exemple une instruction break qui quitte plusieurs boucles, ou comme moyen de se concentrer code de nettoyage en 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 règle générale, son utilisation devrait être limitée à des modèles de conception spécifiques qui le nécessitent de manière contrôlée et reconnue.

(En C++, il vaut mieux utiliser RAII ou un ScopeGuard(more) au lieu d'utiliser GOTO pour le nettoyage. Mais GOTO est un idiome fréquemment utilisé dans Linux kernel ( autre source ) qui est un excellent exemple de code C idiomatique.)

La bande dessinée XKCD est une blague sur la question "Est-ce que GOTO doit toujours être considéré comme nuisible lorsque certains modèles de conception spécifiques sont grandement aidés par son utilisation?"

24
Ken Bloom

Avez-vous google le problème?

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

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

8
John Smith

C'est possible en C++ parce que c'est possible en C. Que vous utilisiez ou non cette guerre est une guerre religieuse de longue date.

6
Nikolai Fetissov