Урок №66. Оператор goto

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 142225

 ǀ   7 

Оператор goto — это оператор управления потоком выполнения программ, который заставляет центральный процессор выполнить переход из одного участка кода в другой (осуществить прыжок). Другой участок кода идентифицируется с помощью лейбла. Например:

В этой программе пользователю предлагается ввести неотрицательное число. Однако, если пользователь введет отрицательное число, программа, используя оператор goto, выполнит переход обратно к лейблу tryAgain. Затем пользователю снова нужно будет ввести число. Таким образом, мы можем постоянно запрашивать у пользователя ввод числа, пока он не введет корректное число.

Ранее мы рассматривали два типа области видимости: локальная (или «блочная») и глобальная (или «файловая»). Лейблы используют третий тип области видимости: область видимости функции. Оператор goto и соответствующий лейбл должны находиться в одной и той же функции.

Существуют некоторые ограничения на использование операторов goto. Например, вы не сможете перепрыгнуть вперед через переменную, которая инициализирована в том же блоке, что и goto:

В целом, программисты избегают использования оператора goto в языке C++ (и в большинстве других высокоуровневых языков программирования). Основная проблема с ним заключается в том, что он позволяет программисту управлять выполнением кода так, что точка выполнения может прыгать по коду произвольно. А это, в свою очередь, создает то, что опытные программисты называют «спагетти-кодом». Спагетти-код — это код, порядок выполнения которого напоминает тарелку со спагетти (всё запутано и закручено), что крайне затрудняет следование порядку и понимание логики выполнения такого кода.

Как говорил один известный специалист в информатике и программировании, Эдсгер Дейкстра: «Качество программистов — это уменьшающаяся функция плотности использования операторов goto в программах, которые они пишут».

Оператор goto часто используется в некоторых старых языках, таких как Basic или Fortran, или даже в языке Cи. Однако в C++ goto почти никогда не используется, поскольку любой код, написанный с ним, можно более эффективно переписать с использованием других объектов в языке C++, таких как циклы, обработчики исключений или деструкторы (всё перечисленное мы рассмотрим чуть позже).

Правило: Избегайте использования операторов goto, если на это нет веских причин.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (425 оценок, среднее: 4,92 из 5)
Загрузка...

Комментариев: 7

  1. Артём:

    Хоть использование goto не приветствуется, а порой даже проклинается, есть случаи, когда без него оч трудно обойтись.

    Например, при написании своей программы мне необходимо было сделать так, чтобы из любой точки выполнения программы пользователь мог при нажатии на Esc вернуться в самое главное меню. Да, альтернативно можно было весь код запихнуть в бесконечный цикл на отлов кода клавиши Esc. Однако, там был не безусловный переход в главное меню, а вызывалось подменю "Хотите выйти?" и в случае отказа, программа должна была продолжить выполнение, убрав окно с предложением выйти. Я не знаю на сегодняшний момент более изящного решения этой проблемы, чем goto.

  2. Максим:

    Из рубрики "вдруг кому-то пригодится".
    Раз не рекомендуется использовать оператор goto, прикладываю замену кода из лекции с помощью цикла while():

    1. Максим:

      Ха, сначала следовало бы пройти все следующие уроки про циклы))
      Зато получилось показать разные варианты решения одной и той же "задачи".
      С циклом do while код получается меньше и лаконичнее:

  3. SuRprizZe:

    Привет , вот я решал тест с главы номер 5, я как понял оператор goto лучше не использовать , но у меня возникла идея с этим оператором и я решил использовать , как можно заменить его?

    1. Tykan:

      Например, использовать бесконечный for(;;) и использовать break, когда условие выполняется верно.

      Сам goto, кстати, выгодно использовать для выхода из нескольких вложенных циклов. Либо использовать bool как флаг и делать несколько проверок через if.

      1. игорь:

        и ни какого goto

    2. Moonilis:

      Думаю уже не актуально, но кому-то может пригодится.
      Можно заменить на цикл while:

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *