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