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

Полезные материалы