goto
goto — оператор безусловного перехода к метке в коде; изредка полезен для выхода из нескольких вложенных циклов сразу, но в остальных случаях лучше избегать.
Полная статья
Описание
goto — это оператор безусловного перехода: он немедленно передаёт управление в то место программы, которое отмечено указанной меткой. Выполнение продолжается с этой точки, а весь код между goto и меткой пропускается.
Оператор существует в языке C/C++ с самого начала, но в современном коде его используют крайне редко — и на это есть веские причины.
Синтаксис
label:
goto label; // передаёт управление на метку
Пример кода
for (byte r = 0; r < 255; r++) {
for (byte g = 255; g > 0; g--) {
for (byte b = 0; b < 255; b++) {
if (analogRead(0) > 250) {
goto bailout;
}
// другие операторы...
}
}
}
bailout:
// другие операторы...
Метка — это обычный идентификатор, за которым стоит двоеточие. Она может располагаться как до, так и после оператора goto в тексте программы.
Когда goto может быть полезен
Главная ситуация, где goto действительно упрощает код — это выход из нескольких уровней вложенных циклов или условий одновременно. Обычные циклов for или блоков if при определённых условиях прерывают только ближайший цикл, и чтобы выйти из трёх вложенных циклов сразу, без goto приходится вводить дополнительные флаги и усложнять логику.
В таких узких сценариях один goto с понятной меткой может быть честнее и читаемее, чем цепочка флагов и дополнительных проверок.
Практические замечания
- Используйте
gotoосторожно и редко. Большинство задач решаются без него — через функции, циклы,break,returnи флаговые переменные. - Выбирайте говорящие имена меток. Метка вроде
exit_loop:объясняет намерение; меткаl1:— нет. - Не прыгайте через объявления переменных. Если
gotoперепрыгивает через место, где объявляется переменная, компилятор выдаст ошибку или предупреждение. - Прыжки только в пределах одной функции.
gotoне позволяет перейти в другую функцию — это не замена вызову функции. - Не злоупотребляйте. При неограниченном использовании
gotoпревращает программу в «спагетти-код»: поток выполнения становится непредсказуемым, и отлаживать такой скетч крайне сложно.
Примечания и предупреждения
Использование goto не рекомендуется в программировании на C, и некоторые авторы книг утверждают, что goto оператор никогда не является необходимым. Тем не менее при разумном применении он может упростить отдельные программы. Главная проблема в том, что при бесконтрольном использовании goto операторов легко получить программу с запутанным потоком выполнения, которую практически невозможно отладить.
Вместе с тем бывают случаи, когда goto действительно упрощает код. Типичный пример — одновременный выход из глубоко вложенных циклов циклов for или блоков if при определённых условиях, когда стандартные средства управления потоком требуют значительно больше кода.