1. Compararea buclelor: forvswhile

O whilebuclă poate fi folosită oriunde este nevoie de mai multe ori o instrucțiune sau un grup de instrucțiuni. Dar dintre toate scenariile posibile, unul merită evidențiat.

Vorbim despre situația în care programatorul (creatorul programului) știe dinainte de câte ori trebuie executată bucla. Acest lucru este de obicei gestionat prin declararea unei variabile speciale de contor și apoi creșterea (sau scăderea) variabilei cu 1fiecare iterație a buclei.

Totul pare să funcționeze așa cum ar trebui, dar nu este foarte convenabil. Înainte de buclă, setăm valoarea inițială a variabilei contorului. Apoi în condiția verificăm dacă a atins deja valoarea finală. Dar de obicei schimbăm valoarea chiar la sfârșitul corpului buclei.

Și ce se întâmplă dacă corpul buclei este mare? Sau dacă avem mai multe bucle imbricate? În general, în aceste cazuri este de dorit să colectați toate aceste informații despre variabilele contorului într-un singur loc. Și de aceea avem forbucla în Java. De asemenea, nu pare foarte complicat:

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

O whilebuclă are doar o condiție în paranteze, dar o forbuclă adaugă două instrucțiuni, separate prin punct și virgulă.

Realitatea este mai simplă decât pare: compilatorul convertește o forbuclă într-o whilebuclă obișnuită astfel:

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

Sau mai bine, haideți să demonstrăm acest lucru cu un exemplu. Cele două fragmente de cod de mai jos sunt identice.

Opțiunea 1 Opțiunea 2
for (int i = 0; i < 20; i++)
{
   System.out.println(i);
}
int i = 0;
while (i < 20)
{
   System.out.println(i);
   i++;
}

Tocmai am adunat într-un singur loc tot codul care se referă la ivariabila contor.

Într-o forbuclă, instrucțiunea 1 este executată o singură dată, înainte ca bucla în sine să înceapă. Acest lucru poate fi văzut clar în al doilea fragment de cod

instrucțiunea 2 este executată de același număr de ori ca și corpul buclei și de fiecare dată este executată după ce întregul corp al buclei a fost executat


2. Unde foreste folosită bucla

Bucla foreste probabil cel mai folosit tip de buclă în Java. Este folosit peste tot, pentru programatori este doar mai clar și mai convenabil decât o whilebuclă. Practic, orice whilebuclă poate fi convertită într-o forbuclă.

Exemple:

buclă while pentru buclă
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;
}

Atenție la ultimul exemplu. Lipsesc instrucțiunile pentru lucrul cu contorul de bucle. Nu există contor și nici declarație.

Într-o forbuclă, Java vă permite să omiteți „instrucțiunea pentru a inițializa contorul” și „instrucțiunea pentru a actualiza contorul”. Chiar și expresia care definește condiția buclei poate fi omisă.



3. Nuanțe de utilizare a forbuclei

Un punct important despre utilizarea forbuclelor breakși continuedeclarațiilor.

O breakinstrucțiune într-o forbuclă funcționează la fel ca și într-o whilebuclă - se încheie imediat bucla. O continueinstrucțiune omite corpul buclei, dar nu statement 2(ceea ce schimbă contorul buclei).

Să aruncăm o altă privire asupra modului în care forși whilebuclele sunt legate.

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

Dacă o continueinstrucțiune este executată într-o forbuclă , atunci restul blocului de instrucțiuni este omis, dar instrucțiunea 2 (cea care funcționează cu forvariabila contor a buclei) este încă executată.

Să revenim la exemplul nostru cu sărirea peste numere care sunt divizibile cu 7.

Acest cod va fi în buclă pentru totdeauna Acest cod va funcționa bine
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);
}

Codul care folosește whilebucla nu va funcționa - nu voi fi niciodată mai mare de 7. Dar codul cu forbucla va funcționa bine.



4. Compararea buclelor for: Java vs Pascal

Apropo, Pascal are și o Forbuclă. În general, în esență, fiecare limbaj de programare are unul. Dar în Pascal este foarte clar. Exemple:

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