break и continue
Вернёмся к бегуну на стадионе. Тренер велел пробежать сто кругов, но иногда бег нужно прервать раньше. Бегун ищет на дорожке потерянный ключ: как только нашёл, он сходит с дорожки, и остальные круги уже не нужны. А если на круге лужа, бегун может бросить этот круг и сразу начать следующий.
В цикле для этих двух случаев есть две инструкции:
breakзавершает весь цикл: бегун сходит с дорожки;continueзавершает только текущую итерацию: бегун бросает круг и начинает следующий.
С break вы уже встречались в switch: там он завершал весь switch. В цикле он завершает сам цикл. Найдём первое число от 50 до 100, которое делится на 7. Числа после находки проверять не нужно, поэтому цикл прерывают инструкцией break:
for (int i = 50; i <= 100; i++)
{
if (i % 7 == 0)
{
Console.WriteLine(i); // 56
break;
}
}
Console.WriteLine("done"); // doneДавайте разберём, что происходит:
- Для чисел от
50до55условиеi % 7 == 0ложно, и цикл идёт дальше. 56делится на7без остатка, поэтому программа выводит56.breakзавершает цикл, и программа выводитdone.
break выходит из цикла
break завершает весь цикл, а не только фигурные скобки if, внутри которых стоит. Оставшиеся итерации не выполняются, шаг i++ тоже, и программа переходит к коду после цикла. Поэтому сразу после 56 выводится done.
Без break цикл проверил бы все числа до 100 и вывел бы ещё 63, 70, 77, 84, 91 и 98.
break нужен, когда ответ нашёлся раньше, чем закончился диапазон: первое подходящее число, первое совпадение, первая ошибка.
continue пропускает итерацию
continue завершает только текущую итерацию: остаток тела пропускается, и цикл переходит к следующей. В for перед ней выполняется шаг i++. Сложим только нечётные числа от 1 до 6:
int sum = 0;
for (int i = 1; i <= 6; i++)
{
if (i % 2 == 0)
{
continue;
}
sum += i;
}
Console.WriteLine(sum); // 9Разберём по шагам:
- Для чётного
iусловиеi % 2 == 0истинно, иcontinueпропускает строкуsum += i. - Для нечётного
iусловие ложно, иsum += iдобавляет его к сумме. - После
continueцикл не прерывается: доsum += iдоходят1,3и5, и программа выводит9.
То же можно записать без continue, условием i % 2 != 0 вокруг sum += i. continue удобен, когда тело длинное: проверка стоит в начале, и остальной код не нужно прятать во вложенный if.
Здесь картинка с бегуном расходится с кодом. Бегун, бросивший круг, может забыть поставить отметку в блокноте, а for не забывает: шаг i++ выполняется и после continue.
В цикле while такой страховки нет. Если continue стоит раньше строки, которая меняет переменную условия, эта строка пропускается. Переменная перестаёт меняться, и цикл не закончится никогда.
Поэтому for с continue не получится переписать через while, перенеся шаг в конец тела: continue через этот шаг перепрыгнет.
На собеседовании часто просят объяснить разницу этих двух инструкций. Короткий ответ: break завершает весь цикл, а continue — только текущую итерацию.
Частая ошибка
break поставили в ветку if, чтобы выйти из неё раньше:
int n = 5;
if (n > 3)
{
Console.WriteLine("big");
break; // ✗
}
Console.WriteLine("end");error CS0139: No enclosing loop out of which to break or continueПрограмма не компилируется. Сообщение значит: «нет цикла, из которого можно выйти через break или continue». break завершает только цикл или switch, а ветку if завершить не может. Если часть ветки должна выполняться не всегда, поместите её во вложенный if.
Главное
breakзавершает весь цикл, и программа переходит к коду после него.continueпропускает остаток текущей итерации; вforперед следующей итерацией выполняется шаг.- В
whileпеременную условия меняют доcontinue, иначе цикл не закончится. breakиcontinueработают только внутри цикла, аbreak— ещё и вswitch.