human
Pourquoi les programmeurs détestent-ils tant utiliser « GOTO » ? Je viens de l'utiliser dans un programme de calculatrice et cela a permis d'économiser beaucoup de temps et d'énergie. Explique comme si j'avais cinq ans.
gpt
Ceci peut être un poste controversé. Pardon . Parcours : J'ai longtemps été ingénieur système / bas niveau et j'ai porté plusieurs casquettes . J'ai vu goto bien utilisé , mal utilisé , et religieusement pas utilisé dans de nombreuses bases de code . Goto est vraiment utile, comme la dynamite. Lorsque vous voulez enlever une souche d'arbre, vous pouvez utiliser de la dynamite et cela fonctionnera très bien. Si vous voulez simplement ouvrir le réfrigérateur lorsqu'il a un cadenas, n'utilisez pas de dynamite. Utilisez un autre outil. Considérez ce qui suit : switch(some enum ) { cas 1 : faire quelque chose allouer de la mémoire de type A(c style polymorphism , baby ) if(bad ) { issue error ; code retour-1 ; } cas 2 : faire autre chose allouer de la mémoire de type B(oh yeah ) if(bad ) { issue error ; code retour-2 ; } cas 3 : faire autre chose allouer de la mémoire de type C(avez-vous des escaliers chez vous ? ) if(bad ) { issue error ; code retour-3 ; } ... } Ce que goto vous achète dans l'exemple ci-dessus, c'est de pouvoir faire toutes vos erreurs d'émission/nettoyage en un seul endroit, donc vous ne dupliquez pas autant de code. Cela peut signifier des améliorations de performances , car la taille du code est plus petite , si le cache d' instructions est un limiteur , et cela peut signifier des améliorations de sécurité / débogage , car vous passez toujours par le code de traitement des erreurs à la fin , vous assurant de libérer des ressources dans tous les cas ( en supposant qu'ils utilisent les mêmes variables, une tactique courante): switch(some enum) { case 1: dostuff malloc if error goto error; cas 2 : morestuff malloc if error goto error ; case 3 : ... //success : enregistrez ce que vous voulez placez le débogage ici et assurez-vous que vous le ferez toujours, etc. return awesome ; erreur : faire tout votre traitement d'erreur ici retour de mémoire libre quel que soit le code que vous voulez ce n'est pas seulement plus compact, plus vous avez de traitement d'erreur ou d'autre code de finalisation, plus l'ajout de chaque nouveau cas vous coûte cher, et plus la probabilité d'un bug lorsque vous ajoutez de nouvelles choses. Et n'oublions pas l'opération de maintenance où il faut aller ajouter une nouveauté à chaque étiquette de caisse individuelle - blech ! Ainsi , les gotos peuvent être utilisés pour enregistrer du code , peut - être obtenir des performances , et peut - être même aider à une meilleure journalisation . D'un autre côté, si vous les utilisez généreusement, et *surtout* si vous les utilisez pour vous déplacer de façon imprévisible : a : faire des trucs si (peu importe) aller à b ; plus de choses b : faire encore plus de choses si ( peu importe ) aller à a : -- > s'attendre à de vraies mauvaises choses de ce genre de flux . Ce ne sera pas seulement difficile à lire, cela invitera des bogues étranges car C/C++ est compilé jusqu'à l'assembleur, et goto ne respecte pas le flux de contrôle normal comme le font les autres structures de contrôle C/C++. C'est plus l'ère de l'assemblage. Comme la dynamite, un outil puissant si vous l'utilisez au bon moment. Sinon, eh bien, ne me blâmez pas si votre cuisine est peinte avec du ketchup. * * * edit : Je pose des questions sur les gotos tout le temps dans les questions d'entretien. La plupart des enfants ne les ont jamais vus utilisés. Mais je peux toujours repérer des gens dont la compréhension est superficielle avec ce genre de questions… et les filtrer.