Подтвердить что ты не робот

Что не так с использованием goto?

Возможные дубликаты:
Почему плохо использовать goto? GOTO по-прежнему считается вредным?

Я был ramdomming через xkcd и увидел это (если также прочитал некоторые негативные тексты о них несколько лет назад):
your slow connection sucks, get a faster one to see this image
Что на самом деле не так? Почему goto даже возможно в С++ тогда?

Почему я должен не использовать?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Нет ничего плохого в 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 для реализации подпрограмм является основным способом злоупотребления им. Это создает так называемый "код спагетти", который излишне трудно читать и поддерживать.

Ответ 3

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

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

Ответ 4

В 1968 году Edsger Dijkstra написал знаменитое письмо редактору Communications of ACM GOTO считается вредным, в котором он изложил случай структурированного программирования с while циклами и , если... then... else, Когда GOTO используется для замены этих структур управления, результат очень часто получается код спагетти. Практически каждый язык программирования, используемый на сегодняшний день, представляет собой структурированный язык программирования, и использование GOTO в значительной степени устранено. На самом деле Java, Scala, Ruby и Python вообще не имеют команды goto.

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

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

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

Ответ 5

У вас возникла проблема с Google?

Основоположником движения против Хэто является Эдсгер Дийскстра со своим легендарным "Готовым вредным"

Чтобы начать работу, вы можете перейти (ха-ха!) http://en.wikipedia.org/wiki/GOTO

Ответ 6

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