Урок №70. Операторы break и continue

  Юрий  | 

  |

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

 138151

 ǀ   9 

Хотя вы уже видели оператор break в связке с оператором switch, все же он заслуживает большего внимания, поскольку может использоваться и с циклами. Оператор break приводит к завершению выполнения циклов do, for или while.

break и switch

В контексте оператора switch оператор break обычно используется в конце каждого кейса для его завершения (предотвращая fall-through):

break и циклы


В контексте циклов оператор break используется для завершения работы цикла раньше времени:

Эта программа позволяет пользователю ввести до 10 чисел и в конце подсчитывает их сумму. Если пользователь введет 0, то выполнится break и цикл завершится (не важно, сколько чисел в этот момент успел ввести пользователь).

Обратите внимание, оператор break может использоваться и для выхода из бесконечного цикла:

break и return

Новички часто путают или не понимают разницы между операторами break и return. Оператор break завершает работу switch или цикла, а выполнение кода продолжается с первого стейтмента, который находится сразу же после этого switch или цикла. Оператор return завершает выполнение всей функции, в которой находится цикл, а выполнение продолжается в точке после вызова функции:

Оператор continue


Оператор continue позволяет сразу перейти в конец тела цикла, пропуская весь код, который находится под ним. Это полезно в тех случаях, когда мы хотим завершить текущую итерацию раньше времени. Например:

Эта программа выведет все числа от 0 до 19, которые не делятся нацело на 4.

В случае с циклом for часть инкремента/декремента счетчика по-прежнему выполняется даже после выполнения continue (так как инкремент/декремент происходит вне тела цикла).

Будьте осторожны при использовании оператора continue с циклами while или do while. Поскольку в этих циклах инкремент счетчиков выполняется непосредственно в теле цикла, то использование continue может привести к тому, что цикл станет бесконечным! Например:

Предполагается, что программа выведет все числа от 0 до 9, за исключением 5. Но на самом деле:

0 1 2 3 4

А затем цикл станет бесконечным. Когда значением count становится 5, то условие оператора if станет true, затем выполнится continue и мы, минуя вывод числа и инкремент счетчика, перейдем к следующей итерации. Переменная count так и не увеличится. Как результат, в следующей итерации переменная count по-прежнему останется со значением 5, а оператор if по-прежнему останется true, и цикл станет бесконечным.

А вот правильное решение, но с использованием цикла do while:

Результат выполнения программы:

0 1 2 3 4 6 7 8 9

break и continue

Многие учебники рекомендуют не использовать операторы break и continue, поскольку они приводят к произвольному перемещению точки выполнения программы по всему коду, что усложняет понимание и следование логике выполнения такого кода.

Тем не менее, разумное использование операторов break и continue может улучшить читабельность циклов в программе, уменьшив при этом количество вложенных блоков и необходимость наличия сложной логики выполнения циклов. Например, рассмотрим следующую программу:

Эта программа использует логическую переменную для выхода из цикла, а также вложенный блок, который запускается только в том случае, если пользователь не использует символ выхода.

А вот более читабельная версия, но с использованием оператора break:

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

Уменьшение количества используемых переменных и вложенных блоков улучшают читабельность и понимание кода намного больше, чем операторы break или continue могут нанести вред. По этой причине считается приемлемым их разумное использование.


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

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

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

  1. Яна:

    Наконец могу ещё с начала темы о вводе переменных реализовать программу , позволяющая ввести имя и в случае ошибки начать всё заново. Маленькая победа длиной пятью глав 🙂

  2. Александр:

    Вы очень хорошо оговорились о "разумном использовании". Если человек только начинает изучать программирование, то ни о каком "разумном использовании" речи идти не может 🙂

    В учебниках много дичи, но рекомендация не использовать goto и его производные хорошая. Во всяком случае на стадии обучения.

    Я бы еще одну рекомендацию для новичков добавил — "одна функция — один return"…

  3. Александр:

    Почему бы просто цикл while не исправить, а не писать do while. Достаточно же добавить 1 строку:

    Лично у меня всё отлично заработало (я просто работаю на Linux-Ubuntu, и особенности MSVisual не знаю, возможно на ней так не прокатит, но по идее должно).

    1. Вадим:

      Данный вариант будет работать везде, но это костыль, у вас в двух местах ++count. Зачем писать такой говнокод, если есть средства языка позволяющие делать лаконичные решения, например, с do while?

      1. Борис:

        Это тоже лаконично (ему там даже continue не нужно, он забыл его удалить). Это ещё далеко не говнокод, а вполне приемлемо.

    2. Борис:

      Можно и так конечно, и в вашем случае даже continue не нужен, сотрите его!

      1. Константин:

        Если удалить continue, то count увеличится на единицу, затем count выведется на экран (6), а затем еще раз увеличится на 1.

  4. Герман:

    Уважаемый автор, возможно ли использовать оператор return, без параметров, для того чтобы прекратить выполнение функции типа void

    1. Фото аватара Юрий:

      Да, иногда используется оператор return без каких-либо значений.

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

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