В этой теме мы рассмотрим примеры правильного использования gotoC или 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, введя цикл, дополнительный флаг, стек вложенных ifs или что-то еще, но почему бы не подумать, gotoможет ли это лучший инструмент для работы? Другими словами, на сколько уродства готовы вынести люди, чтобы избежать использования встроенной языковой функции по прямому назначению? Я считаю, что даже добавление флага - это слишком высокая цена. Мне нравится, что мои переменные представляют объекты в области проблем или решений. «Исключительно для того, чтобы избежать» - gotoэто не значит.
Я приму первый ответ, который дал шаблон C для перехода к блоку очистки. ИМО, это самый веский аргумент в пользу gotoиз всех опубликованных ответов, конечно, если вы измеряете это искажениями, которые ненавистник должен пройти, чтобы избежать этого.