Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Цикл for в Java: обычный и расширенный обход

💻 Информатика · 9 класс

Счётчик, сумма массива и enhanced for: когда нужен индекс и что меняет continue.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Как работает обычный for

В Java цикл for объединяет начальную часть, логическое условие и шаг. Инициализация выполняется один раз, условие проверяется перед каждым телом, шаг — после очередной итерации. Пример for (int i = 0; i < 3; i++) даёт значения i: 0, 1, 2. Значение 3 уже не проходит проверку.

Условие в Java должно иметь тип boolean. Число 1 не заменяет true, как в некоторых примерах языка C. Если условие сразу false, тело не выполняется. Переменная, объявленная в заголовке, доступна в условии, шаге и теле, но не за пределами цикла.

Сумма массива

int[] values = {4, 7, 2};
int total = 0;
for (int i = 0; i < values.length; i++) {
    total += values[i];
}
System.out.println(total);

Получаем 13. Длина массива равна 3, последний индекс равен 2. При условии i <= values.length цикл попытался бы обратиться к values[3], и Java выбросила бы ArrayIndexOutOfBoundsException. Длина и последний индекс — разные числа.

Расширенный for

int total = 0;
for (int value : values) {
    total += value;
}
System.out.println(total);

Расширенный for последовательно получает элементы массива; он удобен, если индекс не нужен. Слева от двоеточия объявляется переменная элемента, справа находится массив или подходящий Iterable. Здесь value — значение очередного int, а не индекс 0, 1, 2.

Запись value = 0; внутри такого цикла не обнулит элементы массива int: она изменит локальную переменную итерации. Если нужно присвоить новые значения ячейкам, используйте индекс и values[i]. Для объектов нужно отдельно различать изменение переменной-ссылки и изменение самого объекта.

Шаг и управление

Шаг не обязан быть i++: можно обходить каждый второй элемент или двигаться назад. Для обратного обхода массива с int начинают с values.length − 1 и продолжают, пока i >= 0, уменьшая i. У пустого массива начало равно −1, поэтому тело не выполняется.

Continue пропускает остаток текущего тела, затем в обычном for выполняется шаг. Break завершает ближайший цикл полностью. Оба оператора полезны, но слишком много переходов усложняет проверку логики.

Разобранная трассировка

В первом примере до цикла total равен 0. После values[0] он равен 4, после values[1] — 11, после values[2] — 13. Затем i становится 3, проверка 3 < 3 ложна. Индекс не нужно увеличивать ещё раз внутри тела: иначе часть элементов будет пропущена.

Практика

  1. Сколько итераций у for (int i = 2; i < 5; i++)?
  2. Что хранит value в расширенном for: элемент или индекс?
  3. Обнулит ли value = 0 массив int[] values?

Ответы

1. Три: i принимает 2, 3, 4. 2. Элемент, поэтому для массива {4,7,2} получаем именно 4, 7, 2. 3. Нет: меняется локальная переменная. Для изменения ячеек нужен явный доступ values[i] либо другой специально выбранный способ.

Связанные материалы

Источники и материалы