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