Управление циклом
Иногда цикл нужно остановить раньше времени или пропустить одну итерацию. Для этого есть операторы 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 9break и 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.