What is wrong with using goto? [duplicate]

106
задан Community 23 May 2017 в 12:10
поделиться

6 ответов

Потому что они приводят к спагетти-коду .

В прошлом в языках программирования не было циклов while, операторов if и т. Д., И программисты использовали goto для построения логики своих программ. Это привело к непоправимому беспорядку.

Вот почему боги CS создали методы, условные выражения и циклы. Структурированное программирование в то время было революцией.

goto подходят в некоторых случаях, например, для выхода из вложенных циклов.

97
ответ дан 24 November 2019 в 03:49
поделиться

Нет ничего плохого в goto , если он используется правильно. Причина, по которой это «табу», состоит в том, что на заре C программисты (часто работающие на ассемблере) использовали goto для создания невероятно трудного для понимания кода.

В большинстве случаев вы можете жить без goto и все будет в порядке. Однако есть несколько случаев, когда goto может быть полезным. Ярким примером является такой случай:

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:

Использование goto для выхода из глубоко вложенного цикла часто может быть чище, чем использование условной переменной и ее проверка на каждом уровне.

Использование goto для реализации подпрограмм является основным способом злоупотребления. Это создает так называемый «спагетти-код», который излишне трудно читать и поддерживать.

62
ответ дан 24 November 2019 в 03:49
поделиться

В 1968 году Эдсгер Дейкстра написал известное письмо редактору Сообщения ACM GOTO считается вредным , в котором он изложил в случае структурного программирования с циклами while и условными операторами if ... then ... else . Когда GOTO используется для замены этих управляющих структур, результатом очень часто становится спагетти-код . Практически каждый язык программирования, который используется сегодня, является языком структурированного программирования, и использование GOTO практически исключено. Фактически, в Java, Scala, Ruby и Python вообще нет команды goto .

В C, C ++ и Perl все еще есть команда GOTO, и бывают ситуации (особенно в C), когда GOTO полезен , например, оператор break, выходящий из нескольких циклов, или как способ концентрации кода очистки в одном месте функции, даже если есть несколько способов завершить функцию (например, путем возврата кодов ошибок в нескольких точках выполнения функции). Но обычно его использование должно быть ограничено конкретными шаблонами проектирования, которые требуют его контролируемым и признанным образом.

(В C ++ лучше использовать RAII или ScopeGuard (подробнее) вместо использования GOTO для очистки. Но GOTO - это часто используемая идиома в ядре Linux ] ( другой источник ), который является отличным примером идиоматического кода C.)

Комикс XKCD - это шутка над вопросом: «Следует ли всегда считать GOTO вредным, если существуют определенные специфические шаблоны проектирования, которые сильно помогло его использование? "

24
ответ дан 24 November 2019 в 03:49
поделиться

Вы погуглили эту проблему?

Основателем движения против гото является Эдсгер Дийскстра с его легендарным «Гото, считающимся вредным»

Для начала вы можете goto (ha ха!) http://en.wikipedia.org/wiki/GOTO

8
ответ дан 24 November 2019 в 03:49
поделиться

Это возможно в C ++, потому что это возможно в C. Независимо от того, следует вы или не должны использовать это, это давняя религиозная война.

6
ответ дан 24 November 2019 в 03:49
поделиться

В самом goto нет ничего плохого. Это очень полезная конструкция в программировании, и ее можно использовать во многих случаях. Лучшее, что приходит на ум, - это структурированное освобождение ресурсов в программах на языке C.

Где goto идут не так, как надо, когда над ними злоупотребляют. Злоупотребление gotos может привести к полностью нечитаемому и неподдерживаемому коду.

31
ответ дан 24 November 2019 в 03:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: