Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Управление циклом

Иногда цикл нужно остановить раньше времени или пропустить одну итерацию. Для этого есть операторы break и continue, а для вложенных циклов — метки.

break

break немедленно завершает цикл, и программа продолжает работу с кода после него. Так удобно останавливать поиск, как только нужное найдено:

void main() {
    int[] numbers = {4, 7, 15, 8, 23};
 
    for (int n : numbers) {
        if (n > 10) {
            IO.println("Первое число больше 10: " + n);
            break;
        }
    }
}

Результат:

Первое число больше 10: 15

Числа 8 и 23 уже не проверяются — цикл завершился на 15.

continue

continue пропускает остаток текущей итерации и переходит к следующей. Цикл при этом продолжается:

void main() {
    for (int i = 1; i <= 6; i++) {
        if (i % 2 == 0) {
            continue;
        }
        IO.print(i + " ");
    }
    IO.println();
}

Результат:

1 3 5

Для чётных i срабатывает continue, и вывод пропускается.

Вложенные циклы

Цикл внутри цикла называется вложенным. Внутренний цикл проходит полностью на каждой итерации внешнего:

void main() {
    for (int row = 1; row <= 3; row++) {
        for (int col = 1; col <= 3; col++) {
            IO.print(row * col + "\t");
        }
        IO.println();
    }
}

Результат:

1	2	3
2	4	6
3	6	9

break и continue действуют только на тот цикл, внутри которого написаны, — то есть на самый внутренний.

Метки

Чтобы выйти сразу из внешнего цикла, его помечают меткой — именем с двоеточием перед циклом, — и пишут break с этим именем:

void main() {
    int[][] seats = {{0, 0, 1}, {0, 1, 0}};
 
    search:
    for (int row = 0; row < seats.length; row++) {
        for (int col = 0; col < seats[row].length; col++) {
            if (seats[row][col] == 1) {
                IO.println("Занято: ряд " + row + ", место " + col);
                break search;
            }
        }
    }
}

Результат:

Занято: ряд 0, место 2

Здесь seats — двумерный массив, то есть массив рядов, где 1 означает занятое место; такие массивы разбирает отдельный урок. Без метки break остановил бы только внутренний цикл, и поиск продолжился бы во втором ряду. continue с меткой работает так же — переходит к следующей итерации помеченного цикла.

Выход из середины

Цикл while (true) никогда не заканчивается сам. Его используют, когда условие выхода удобно проверить в середине тела, и выходят через break:

void main() {
    int balance = 100;
 
    while (true) {
        balance -= 30;
        if (balance < 0) {
            break;
        }
        IO.println("Остаток: " + balance);
    }
}

Результат:

Остаток: 70
Остаток: 40
Остаток: 10

Частая ошибка

В цикле while счётчик меняют вручную. Если continue стоит раньше этого изменения, счётчик застревает на одном значении, и цикл становится бесконечным:

int i = 0;
while (i < 5) {
    if (i == 2) {
        continue; // i++ ниже больше не выполнится
    }
    IO.println(i);
    i++;
}

Программа выведет 0 и 1, а затем зависнет. Увеличивайте счётчик до continue или используйте for, где шаг i++ выполняется даже после continue.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.