range-for, break и continue
В этом уроке две темы. Первая — цикл, которому не нужен счётчик. Вторая — два оператора, которые меняют ход любого цикла: break и continue.
Цикл со счётчиком удобен, когда нужны номера: 0, 1, 2 и так далее. Но чтобы сложить числа 3, 1, 4, 1 и 5, номера не нужны, нужны сами значения. Для этого есть цикл по диапазону: он по очереди кладёт в переменную каждое значение из списка.
#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, и на нём останавливается:
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 пропускает остаток тела и переходит к следующей итерации. С его помощью из суммы исключают чётные числа:
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, где счётчик увеличивается в конце тела:
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 и подпишись на канал — откроются все уроки.