В этой теме мы рассмотрим примеры правильного использования goto
C или C ++. Он вдохновлен ответом, за который люди проголосовали, потому что думали, что я шучу.
Резюме (ярлык изменен с оригинала, чтобы прояснить намерения):
infinite_loop:
// code goes here
goto infinite_loop;
Почему лучше альтернатив:
- Это специфично.
goto
это языковая конструкция, которая вызывает безусловный переход. Альтернативы зависят от использования структур, поддерживающих условные переходы, с вырожденным условием Always-True. - Этикетка документирует намерение без дополнительных комментариев.
- Читателю не нужно сканировать промежуточный код на ранних этапах
break
(хотя для беспринципного хакера все еще возможно смоделироватьcontinue
с раннимgoto
).
Правила:
- Представьте, что готофобы не победили. Понятно, что приведенное выше нельзя использовать в реальном коде, потому что это противоречит устоявшейся идиоме.
- Предположим, что все мы слышали о том, что Goto считается вредным, и знаем, что goto можно использовать для написания кода спагетти.
- Если вы не согласны с примером, критикуйте его только по техническим причинам («Потому что людям не нравится goto» - это не техническая причина).
Посмотрим, сможем ли мы говорить об этом, как взрослые.
редактировать
Этот вопрос кажется законченным. Это дало несколько качественных ответов. Спасибо всем, особенно тем, кто серьезно отнесся к моему примеру с петлей. Большинство скептиков было обеспокоено отсутствием возможности блокировки. Как отметил @quinmars в комментарии, вы всегда можете поместить фигурные скобки вокруг тела цикла. Я мимоходом отмечу это for(;;)
и while(true)
не даю вам брекеты бесплатно (их пропуск может вызвать досадные ошибки). Во всяком случае, я не буду тратить больше ваш мозг власти на этой мелочи - я могу жить с безвредным и идиоматическим for(;;)
и while(true)
(точно так же , если я хочу , чтобы сохранить свою работу).
Принимая во внимание другие ответы, я вижу, что многие люди считают goto
что-то, что вам всегда нужно переписывать по-другому. Конечно, вы можете избежать a goto
, введя цикл, дополнительный флаг, стек вложенных if
s или что-то еще, но почему бы не подумать, goto
может ли это лучший инструмент для работы? Другими словами, на сколько уродства готовы вынести люди, чтобы избежать использования встроенной языковой функции по прямому назначению? Я считаю, что даже добавление флага - это слишком высокая цена. Мне нравится, что мои переменные представляют объекты в области проблем или решений. «Исключительно для того, чтобы избежать» - goto
это не значит.
Я приму первый ответ, который дал шаблон C для перехода к блоку очистки. ИМО, это самый веский аргумент в пользу goto
из всех опубликованных ответов, конечно, если вы измеряете это искажениями, которые ненавистник должен пройти, чтобы избежать этого.