Перейти к содержимому
Теория · Циклы · урок 4 из 8

range-for, break и continue

В этом уроке две темы. Первая — цикл, которому не нужен счётчик. Вторая — два оператора, которые меняют ход любого цикла: break и continue.

Цикл со счётчиком удобен, когда нужны номера: 0, 1, 2 и так далее. Но чтобы сложить числа 3, 1, 4, 1 и 5, номера не нужны, нужны сами значения. Для этого есть цикл по диапазону: он по очереди кладёт в переменную каждое значение из списка.

C++
#include <initializer_list>
#include <iostream>

int main() {
    int sum = 0;
    for (int x : {3, 1, 4, 1, 5}) {
        sum = sum + x;
    }
    std::cout << sum << '\n';  // 14
}

Цикл по диапазону

В заголовке такого цикла три части:

  • объявление переменной int x;
  • двоеточие;
  • диапазон — здесь список значений в фигурных скобках.

Тело выполняется по одному разу для каждого значения: сначала x равна 3, потом 1 и так далее. На каждой итерации x — новая переменная, в которую скопировано очередное значение. Сумма растёт так: 3, 4, 8, 9, 14.

Счётчика, условия и шага нет, поэтому ошибиться на единицу негде. Компилятор превращает список в фигурных скобках в значение стандартного типа std::initializer_list. Строка #include <initializer_list> подключает объявление этого типа.

break

Оператор break сразу завершает цикл: остаток тела и все следующие итерации пропускаются. Этот цикл ищет первое число больше 50, которое делится на 7, и на нём останавливается:

C++
for (int i = 51; i <= 100; ++i) {
    if (i % 7 == 0) {
        std::cout << i << '\n';  // 56
        break;
    }
}

Для 51–55 условие i % 7 == 0 ложно, и цикл идёт дальше. На 56 условие истинно: программа печатает 56, и break завершает цикл. Без break цикл напечатал бы все такие числа до 100: 56, 63, 70 и так далее до 98.

continue

Оператор continue пропускает остаток тела и переходит к следующей итерации. С его помощью из суммы исключают чётные числа:

C++
int sum = 0;
for (int x : {3, 8, 1, 6, 5}) {
    if (x % 2 == 0) {
        continue;
    }
    sum = sum + x;
}
std::cout << sum << '\n';  // 9

Для 8 и 6 условие x % 2 == 0 истинно, и до сложения дело не доходит. В сумму попадают только 3, 1 и 5.

В цикле for со счётчиком после continue всё равно выполняется шаг, а затем проверяется условие. Оба оператора, break и continue, работают в любом цикле: for, while, do-while и цикле по диапазону.

Частая ошибка

continue в цикле while, где счётчик увеличивается в конце тела:

C++
int i = 0;
while (i < 5) {
    if (i == 2) {
        std::cout << "skip\n";
        continue;  // ✗
    }
    std::cout << i << '\n';
    ++i;
}

У while нет шага в заголовке, поэтому continue перескакивает и через ++i. Когда i равна 2, её больше ничто не меняет: условие i < 5 истинно всегда, и программа без конца печатает skip. Увеличьте i перед continue или перепишите цикл через for.

Главное

  • Цикл по диапазону по очереди копирует в переменную каждое значение списка, и счётчик ему не нужен.
  • break сразу завершает цикл, а continue пропускает остаток тела и переходит к следующей итерации.
  • В for со счётчиком шаг выполняется и после continue, а в while — только если стоит до continue.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом