Цикл for

Java Syntax Zero
Рівень 4 , Лекція 6
Відкрита

1. Порівняння циклів: for vs while

Цикл while можна використовувати у всіх випадках, коли команду або групу команд потрібно виконати декілька разів. Але з усіх випадків один випадок варто виділити окремо.

Це випадок, коли програміст (автор програми) заздалегідь знає, скільки разів має виконатися його цикл. Зазвичай це вирішується введенням спеціальної змінної-лічильника, і кожну ітерацію циклу змінна збільшується (або зменшується) на 1.

Наче все працює, як треба, але не дуже зручно. Перед циклом ми задаємо стартове значення змінної-лічильника, потім в умові перевіряємо, чи досягла вона вже фінального значення. А от змінюємо її зазвичай у самому кінці тіла циклу.

А якщо тіло циклу велике? Або у нас декілька вкладених циклів? Загалом, хотілося б в таких випадках зібрати всю цю інформацію про змінну-лічильник в одному місці. Так у Java з'явився цикл for. Виглядає він теж не дуже складно:

for (команда1; умова; команда2)
{
   блок команд
}

Якщо у циклі while у круглих дужках була тільки умова, тут ще додалися дві команди, розділені крапкою з комою.

Все насправді простіше, ніж здається: компілятор перетворює цикл for на звичайний цикл while таким чином:

команда1;
while (умова)
{
   блок команд
   команда2;
}

Чи краще продемонструємо на прикладі: два приклади нижче ідентичні.

Варіант 1 Варіант 2
for (int i = 0; i < 20; i++)
{
 System.out.println(i);
}
int i = 0;
while (i < 20)
{
 System.out.println(i);
   i++;
}

Ми просто взяли і зібрали в одному місці весь код, який стосується змінної-лічильника — i.

команда1 у циклі for виконується тільки один раз перед самим циклом (це видно на другому прикладі)

команда2 виконується стільки ж разів, скільки і тіло циклу, але виконуватиметься кожного разу вже після того, як виконається все тіло циклу


2. Де використовується цикл for

Цикл for, мабуть, найвикористовуваніший варіант циклу в Java. Він застосовується всюди, тому що це просто зрозуміліша і зручніша форма запису циклу while для програмістів. Практично будь-який цикл while можна перетворити на цикл for.

Приклади:

Цикл while Цикл for
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
for (int i = 3; i >= 0; i--)
{
   System.out.println(i);
}
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
for (int i = 0; i < 3; i++)
{
   System.out.println(i);
}
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
for (boolean isExit = false; !isExit; )
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
while (true)
   System.out.println("C");
for (; true; )
   System.out.println("C");
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}
for (; true; )
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}

Зверніть увагу на останній приклад. Там пропущено команди роботи з лічильником циклу. Немає лічильника — немає команд.

Java дозволяє не писати у циклі for «команду ініціалізації лічильника» і «команду зміни лічильника». І навіть вираз-умову циклу можна не писати.



3. Нюанси використання циклу for

Важливий момент щодо використання циклу for та операторів break і continue.

Оператор break у циклі for працює так само, як і в циклі while — приводить до негайного завершення циклу. А от continue приводить до пропуску тіла циклу, але не команди2 (яка змінює лічильник циклу).

Давайте ще раз подивимось, як пов'язані for і while.

for (команда1; умова; команда2)
{
   блок команд
}
команда1;
while (умова)
{
   блок команд
   команда2;
}

Якщо в блоці команд циклу for викликати оператор continue, залишок блоку команд буде пропущено, а от команда2 (яка працює зі змінною-лічильником циклу for) все одно виконається.

Повернемось до нашого прикладу з пропуском чисел, які діляться на 7.

Цей код зациклиться Цей код буде працювати без проблем
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
   i++;
}
for (int i = 1; i <= 20; i++)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
}

Код із використанням циклу while працювати не буде — i ніколи не перевищить 7. А от код із циклом for працюватиме відмінно.



4. Порівняння циклів for: Java vs Pascal

У Паскалі, до речі, теж є цикл For. Він взагалі є практично у всіх мовах програмування. Тільки в Паскалі він набагато зрозуміліший. Приклади:

Pascal Java
For i := 1 to 10 do
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i++)
{
   System.out.println(i);
}
For i := 1 to 10 do step 2
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i = i + 2)
{
   System.out.println(i);
}
For i := 10 downto 0 do step 2
Begin
   Writeln(i);
End;
for (int i = 10; i >= 0; i = i - 2)
{
   System.out.println(i);
}

Коментарі (31)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Владислав Рівень 1
5 червня 2025
Долго не мог понять почему код прерывался на 0. Делал сразу 2 условия в самоме цикле, но вывод был 0. Переделал на if и все получилось. Так понимаю в цикле нельзя использовать условные операторы. Но зашел в правильное решение а там начало вообще от 2 начинается, а не с 1.... И не понимаю почему i = i +2
Іван Рівень 8
10 листопада 2024
Все начебто зрозуміло з першого погляду, потім зануряєшся глибше і глибше-розумієш що - щось не зрозумів і починаєш з початку - замкнуте коло. Поки що я знайшов одне рішення, як вийти з замкнутого кола, це позитивно мислити ))! Бажаю усім - знайти вихід з замкнутого кола!
Olga Рівень 5
26 листопада 2024
Іване, дякую за розуміння того, що я не одна така))
Alexander Safronyuk Рівень 5
10 серпня 2024
Умову задачі взагалі не зрозумів. Доки не питався chat gpt, не зрозуміло було як це має на ділі працювати. Було б краще, якби ви добавили якийсь приклад роботи в описі завдання.
oncer Рівень 7 Expert
25 липня 2024
Ці задачі здалися мені набагало простішими, ніж з попереднього урока.
gummer Рівень 11
26 лютого 2024
В принципі, якщо правильно побудувати останнє завдання, continue там зайвий (без continue код не проходить перевірку, і я лише дарма втратив спробу. Довелось дописати else{continue;} просто, аби код пройшов :C )
Ва Дим Рівень 28
10 березня 2024
так можна і не дописувати

else{continue;}
можна зразу після

sum += start;
continue;
Євгеній Рівень 14 Expert
12 травня 2023
добре, що в курсі є порівняння з мовою Pascal, так я багато чого зрозумів, з того що раніше не піддавалося розумінню ))
Сергей Брага Рівень 6
20 квітня 2023

  //напишіть тут ваш код
        for(; start < end; start++)
        {
            if((start % multiple) == 0)
            sum = sum + start;
            continue;
        }    
Vitalii Рівень 11
28 липня 2023
хм... а нащо тут continue взагалі? цикл і без нього буде ітерувати далі))
Kolapsec Рівень 7
26 листопада 2023
!= 0 :)
Ledzen Рівень 4
15 березня 2023
Раніше якось міг додуматись до вирішення, зараз сиджу читаю умову і не розумію з чого починати писати програму :(
Женя Иващенко Рівень 32
4 лютого 2023
Підскажіть , для чого потрібно оголошувати (в останньому завданні) (int i = start;) , якщо START вже дорівнює 1 (так записано в Input data) ? Чому не можна просто використовувати start замість i ?
Василь Рівень 10 Expert
23 березня 2023
Не потрібно оголошувати, я використовував start і прийняло роботу.
les_yeux_blancs Рівень 50
17 квітня 2023
використовувати start то можна, але тільки якщо ти не проти того, що значення цього самого start буде змінюватись і в результаті стане рівним end тобто, якщо сильно захочеш вкінці зробити щось типу System.out.println("Numbers from " + start + " to " + end + ":"), то отримаєш "Numbers from 10 to 10:"
Volodymyr Рівень 5
23 серпня 2022
в другій задачі блок

if (i % multiple != 0) {
                continue;
            }
            sum = sum + i;
виглядає не дуже доречним, значно логічніше:

if (i % multiple = 0) {
                sum = sum + i;
            }
            
Bandiu Band Рівень 25
6 вересня 2022
Спочатку так і зробив, не замітив умову з continue
Roma Chernesh Рівень 16
30 листопада 2022
теж саме:) continue у данній конкретній задачі прям зовсім не в тему
theylovevalera Рівень 51
12 березня 2023
Такий код не працюватиме,замість "= "там повинно бути "=="🙃
Євгеній Рівень 14 Expert
12 травня 2023

sum += i;
SeVans Рівень 6
23 червня 2023

if (i % multiple = 0) {
                sum = sum + i;
            }
тут буде помилка в умові, правильно:

if ((i % multiple) == 0) {
                sum += i;
            }