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