1. Сравняване на цикли: forvswhile

Цикълът whileможе да се използва навсякъде, където оператор or група от оператори трябва да бъдат изпълнени няколко пъти. Но сред всички възможни сценарии си струва да се подчертае един.

Говорим за ситуацията, когато програмистът (създателят на програмата) знае предварително колко пъти трябва да се изпълни цикълът. Това обикновено се обработва чрез деклариране на специална променлива на брояча и след това увеличаване (or намаляване) на променливата с при 1всяка итерация на цикъла.

Изглежда, че всичко работи Howто трябва, но не е много удобно. Преди цикъла задаваме началната стойност на променливата на брояча. След това в conditionто проверяваме дали вече е достигнала крайната стойност. Но обикновено променяме стойността в самия край на тялото на цикъла.

И Howво, ако тялото на цикъла е голямо? Или ако имаме няколко вложени цикъла? Като цяло, в тези случаи е желателно да се събере цялата тази информация за променливите на брояча на едно място. И затова имаме цикъла forв Java. Освен това не изглежда много сложно:

for (statement 1; condition; statement 2)
{
   block of statements
}

Цикълът whileима само condition в скоби, но forцикълът добавя два израза, разделени с точка и запетая.

Реалността е по-проста, отколкото звучи: компилаторът преобразува forцикъл в обикновен whileцикъл по следния начин:

statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Или още по-добре, нека демонстрираме това с пример. Двата codeови фрагмента по-долу са идентични.

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

Току-що събрахме на едно място целия code, който се отнася до iпроменливата на брояча.

В forцикъл оператор 1 се изпълнява само веднъж, преди да започне самият цикъл. Това може да се види ясно във втория codeов фрагмент

оператор 2 се изпълнява същия брой пъти като тялото на цикъла и всеки път, когато се изпълнява, след като е изпълнено цялото тяло на цикъла


2. Къде forсе използва цикълът

Цикълът forе може би най-използваният тип цикъл в Java. Използва се навсякъде, за програмистите е просто по-ясно и удобно от whileцикъл. На практика всеки 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;
}

Обърнете внимание на последния пример. Липсват операторите за работа с брояча на цикли. Няма брояч и изявление.

В forцикъл Java ви позволява да пропуснете "изявлението за инициализиране на брояча" и "изявлението за актуализиране на брояча". Дори изразът, който дефинира conditionто за цикъл, може да бъде пропуснат.



3. Нюанси на използване на forцикъла

Важен момент относно използването forна цикли breakи continueоператори.

Инструкция breakв forцикъл работи по същия начин като в whileцикъл — прекратява цикъла незабавно. Изявление continueпропуска тялото на цикъла, но не statement 2(което променя брояча на цикъла).

Нека да разгледаме още веднъж How forи whileциклите са свързани.

for (statement 1; condition; statement 2)
{
   block of statements
}
statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Ако continueоператор се изпълни в forцикъл , тогава останалата част от блока оператори се пропуска, но оператор 2 (този, който работи с forпроменливата на брояча на цикъла) все още се изпълнява.

Нека се върнем към нашия пример с прескачане на числа, които се делят на 7.

Този code ще се повтаря завинаги Този code ще работи добре
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. Но codeът с цикъла forще работи добре.



4. Сравнение за цикли: Java срещу Pascal

Между другото, Pascal също има Forцикъл. По принцип всеки език за програмиране има такъв. Но в Паскал е супер ясно. Примери:

Паскал 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);
}