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

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

Je ramdomming à travers xkcd et vu celui-ci (si aussi lu quelques textes négatifs à leur sujet il y a quelques années):
votre connexion lente suce, obtenir un plus rapide pour voir cette image
Quel est réellement le problème avec elle? Pourquoi goto est-il même possible en C++ alors?

Pourquoi devrais-je pas utiliser?

72
demandé sur Community 2010-08-19 04:05:55

6 réponses

Parce Qu'ils conduisent à 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 conduit à un désordre irrécupérable.

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

Les Goto sont appropriés à quelques endroits, par exemple pour sauter des boucles imbriquées

74
répondu Byron Whitlock 2017-10-31 03:46:21

Rien ne va mal avec goto s'il est utilisé correctement. La raison pour laquelle il est "tabou" est que dans les premiers jours de C, les programmeurs (venant souvent d'un arrière-plan d'assemblage) utiliseraient goto pour créer du code incroyablement difficile à comprendre.

La Plupart du temps, vous pouvez vivre sans goto et d'être bien. Il y a quelques cas, cependant, où goto peut être utile. Le premier exemple est un cas comme:

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 profondément imbriquée peut souvent être plus propre que utiliser une variable de condition et la vérifier à tous les niveaux.

L'utilisation de goto pour implémenter des sous-programmes est la principale façon d'en abuser. Cela crée ce qu'on appelle le "code spaghetti" qui est inutilement difficile à lire et à maintenir.

41
répondu bta 2018-03-01 23:17:15

Il n'y a rien de mal avec goto en soi. C'est une construction très utile dans la programmation et a de nombreuses utilisations valides. Le meilleur qui vient à l'esprit est la libération de ressources structurées dans les programmes C.

Là où goto va mal, c'est quand ils sont maltraités. L'abus de gotos peut conduire à un code complètement illisible et non maintenable.

29
répondu JaredPar 2010-08-19 00:08:55

En 1968, Edsger Dijkstra a écrit une lettre célèbre à l'éditeur de Communications de L'ACM GOTO est considéré comme nuisible dans lequel il a exposé le cas pour la programmation structurée avec while boucles et if...puis...else conditions. Lorsque GOTO est utilisé pour remplacer ces structures de contrôle, le résultat est très souvent code spaghetti . À peu près tous les langages de programmation utilisés aujourd'hui sont un langage de programmation structuré, et l'utilisation de GOTOs a été pratiquement éliminé. En fait, Java, Scala, Ruby et Python n'ont pas du tout de commande goto.

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

(en C++, il est préférable d'utiliser 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 " devrait GOTO toujours être considéré comme nuisible quand il y a certains modèles de conception spécifiques qui sont grandement aidés par son utilisation?"

19
répondu Ken Bloom 2012-10-19 04:17:43

Avez-vous google le problème?

Le fondateur du mouvement anti-goto est Edsger Dijskstra avec son légendaire "Goto considéré comme nuisible"

Pour vous aider à démarrer, vous pouvez goto (ha ha!) http://en.wikipedia.org/wiki/GOTO

7
répondu John Smith 2010-08-19 00:09:33

C'est possible en C++ parce que c'est possible en C. que vous deviez ou non l'utiliser est une guerre de religion de longue date.

4
répondu Nikolai Fetissov 2010-08-19 00:08:55