1. Порівняння циклів for і 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 і Pascal

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

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);
}