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

range-for, break и continue

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

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
}

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

В заголовке такого цикла стоят объявление (declaration) переменной, двоеточие и диапазон. Здесь диапазон — список значений в фигурных скобках. Тело выполняется по одному разу для каждого значения: сначала x равна 3, потом 1 и так далее. На каждой итерации x — новая переменная, в которую скопировано очередное значение.

Счётчика, условия и шага нет, поэтому ошибиться на единицу негде. Список в фигурных скобках компилятор (compiler) превращает в объект стандартного типа 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;
    }
}

Без break цикл напечатал бы все такие числа до 100: 56, 63, 70 и так далее до 98.

continue

Оператор continue пропускает остаток тела и переходит к следующей итерации. В цикле for со счётчиком после 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. Оба оператора, 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.