Перейти к содержимому
Теория · Условия и циклы · урок 9 из 13

break и continue

Вернёмся к бегуну на стадионе. Тренер велел пробежать сто кругов, но иногда бег нужно прервать раньше. Бегун ищет на дорожке потерянный ключ: как только нашёл, он сходит с дорожки, и остальные круги уже не нужны. А если на круге лужа, бегун может бросить этот круг и сразу начать следующий.

В цикле для этих двух случаев есть две инструкции:

  • break завершает весь цикл: бегун сходит с дорожки;
  • continue завершает только текущую итерацию: бегун бросает круг и начинает следующий.

С break вы уже встречались в switch: там он завершал весь switch. В цикле он завершает сам цикл. Найдём первое число от 50 до 100, которое делится на 7. Числа после находки проверять не нужно, поэтому цикл прерывают инструкцией break:

C#
for (int i = 50; i <= 100; i++)
{
    if (i % 7 == 0)
    {
        Console.WriteLine(i); // 56
        break;
    }
}

Console.WriteLine("done"); // done

Давайте разберём, что происходит:

  1. Для чисел от 50 до 55 условие i % 7 == 0 ложно, и цикл идёт дальше.
  2. 56 делится на 7 без остатка, поэтому программа выводит 56.
  3. break завершает цикл, и программа выводит done.

break выходит из цикла

break завершает весь цикл, а не только фигурные скобки if, внутри которых стоит. Оставшиеся итерации не выполняются, шаг i++ тоже, и программа переходит к коду после цикла. Поэтому сразу после 56 выводится done.

Без break цикл проверил бы все числа до 100 и вывел бы ещё 63, 70, 77, 84, 91 и 98.

break нужен, когда ответ нашёлся раньше, чем закончился диапазон: первое подходящее число, первое совпадение, первая ошибка.

continue пропускает итерацию

continue завершает только текущую итерацию: остаток тела пропускается, и цикл переходит к следующей. В for перед ней выполняется шаг i++. Сложим только нечётные числа от 1 до 6:

C#
int sum = 0;

for (int i = 1; i <= 6; i++)
{
    if (i % 2 == 0)
    {
        continue;
    }
    sum += i;
}

Console.WriteLine(sum); // 9

Разберём по шагам:

  1. Для чётного i условие i % 2 == 0 истинно, и continue пропускает строку sum += i.
  2. Для нечётного i условие ложно, и sum += i добавляет его к сумме.
  3. После 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, чтобы выйти из неё раньше:

C#
int n = 5;

if (n > 3)
{
    Console.WriteLine("big");
    break; // ✗
}

Console.WriteLine("end");
TEXT
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.