Почему и когда следует использовать goto в C/С++?
Я знаю много вопросов о том, почему не использовать goto
, почему goto
- плохая практика, почему goto
был создан дьяволом, почему пальцы тех, кто набирает goto
, должны быть сорваны и т.д...
И в много ответов на эти вопросы, этот вопрос, и даже в wikipedia можно найти причины pro/против goto
.
Даже Stackoverflow имеет тег goto
:)
Но, очевидно, goto
принимается как действительная команда, иначе ваш компилятор/интерпретатор не знал бы, что с ним делать. Даже в C/С++ можно использовать goto
, и этот язык даже имеет формальную спецификацию ISO.
Итак, возможно, должен быть какой-то случай, когда только с помощью goto
можно выполнить некоторую задачу. Затем, почему и когда следует использовать goto
в C/С++?
Edit:
Просто, чтобы убедиться:
1 - этот вопрос не требует обсуждения. Он должен отвечать следующим образом: предоставление одного или нескольких случаев, когда goto
является единственным решением, или указывая no, it always possible to avoid a goto
. Конечно, я не единственный, кто может решить, должен ли он быть закрыт или нет, но я не думаю, что "слишком широкий, требует обсуждения и т.д." - это причины его закрытия.
2 - могут быть случаи, когда goto
сделать код чище, быстрее и т.д. Я не хочу этого. Я хочу знать, существует ли один случай, когда goto
является единственным решением (нет, это не дубликат этого вопроса "дать хорошие примеры goto" )
3 - Я приму любую нить с улыбкой на лице, если нисходящая линия оправдана. Но я уверен, что у этого вопроса есть ответ, и он сделал предыдущие исследования по этому вопросу. Downvoting просто потому, что использовалось это табу-слово с четырьмя буквами, которое начинается с "G"... извините...
Ответы
Ответ 1
Нет никаких обстоятельств, при которых a goto
является строго необходимым: вы всегда можете избежать этого, если вы действительно этого хотите, но сделать это по чисто идеологическим причинам является ошибкой.
Например, мой друг написал функцию вейвлет-преобразования, которая имела (что-то вроде) 15 вложенных циклов. В случае ошибки в этих циклах он был goto
в блок очистки непосредственно перед оператором return
. Для достижения такого же эффекта без goto было бы связано с установкой флага и его тестированием на каждом уровне цикла, что сделало бы его код намного менее удобочитаемым. В этих обстоятельствах правильный выбор был goto
.
Ответ 2
Последний стандарт MISRA теперь позволяет получить доступ.
Хороший пример, когда gotos имеют смысл, когда у вас большая рутина с большим количеством точек выхода. У вас может быть много операторов возврата (не хорошо), сверните код с условными выражениями "структурированного программирования" (также не очень хорошо) или "goto Done", который перед отправкой отправляет программу в набор конечных операторов.
Стандарт MISRA в принципе допускает переходы для таких обстоятельств. Я думаю, что "только нисходящий" является одним из их критериев.
Ответ 3
Единственная причина, по которой я использую goto, это когда это условие возврата ошибки из функции, которая требует некоторой общей очистки. Цель goto находится ближе к концу функции, а "нормальный" возврат возвращается перед меткой.
Ответ 4
Вот пример, где будет работать только goto:
fooobar.com/info/9538/...
В принципе, если у вас несколько вложенных циклов for
, единственный способ вырваться из всех циклов из внутреннего цикла - это оператор goto
(поскольку в отличие от некоторых других языков ключевое слово C break
поддерживайте параметр для того, чтобы количество уровней вложенности разрывалось).