1. Porównanie cykli: for vs while

Pętli whilemożna używać we wszystkich przypadkach, w których polecenie lub grupa poleceń musi zostać wykonana wiele razy. Ale spośród wszystkich przypadków jeden przypadek wyróżnia się szczególnie.

Dzieje się tak w przypadku, gdy programista (autor programu) z góry wie, ile razy ma zostać wykonana jego pętla. Zwykle rozwiązuje się to przez wprowadzenie specjalnej zmiennej licznika, a przy każdej iteracji pętli zmienna jest zwiększana (lub zmniejszana) o 1.

Wszystko wydaje się działać tak, jak powinno, ale nie jest to zbyt wygodne. Przed pętlą ustawiamy wartość początkową zmiennej licznika, następnie w warunku sprawdzamy czy osiągnęła już wartość końcową. Ale zwykle zmieniamy to na samym końcu ciała pętli.

Co jeśli ciało pętli jest duże? A może mamy wiele zagnieżdżonych pętli? Generalnie w takich przypadkach chciałbym zebrać wszystkie te informacje o zmiennej licznika w jednym miejscu. Tak powstała pętla w Javie for. Nie wygląda to też na trudne.

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

Jeśli pętla whilew nawiasach miała tylko warunek, to for dodawane były dwa polecenia oddzielone średnikiem.

W rzeczywistości wszystko jest prostsze niż się wydaje: kompilator zamienia pętlę forw zwykłą pętlę, whiletaką jak ta:

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

Lub lepiej zademonstruj na przykładzie: dwa poniższe przykłady są identyczne.

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

Po prostu wzięliśmy i zebraliśmy w jednym miejscu cały kod dotyczący zmiennej licznika - i.

polecenie1 w pętli forjest wykonywane tylko raz przed samą pętlą (widać to w drugim przykładzie)

Polecenie2 jest wykonywane tyle samo razy co treść pętli, ale będzie wykonywane za każdym razem po wykonaniu całej treści pętli


2. Gdzie używany jest cyklfor

Pętla forjest prawdopodobnie najczęściej używaną pętlą for w Javie. Jest używany wszędzie, ponieważ to po prostu bardziej zrozumiała i wygodna forma pisania pętli whiledla programistów. Prawie każdą pętlę whilemożna przekształcić w pętlę for.

Przykłady:

pętla while dla pętli
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;
}

Zwróć uwagę na ostatni przykład. Brakuje tam instrukcji pracy z licznikiem pętli. Brak licznika - brak komend.

Java pozwala nie pisać w cyklu for„komenda zainicjowania licznika” i „komenda zmiany licznika”. I nawet warunku wyrażenia cyklu nie da się zapisać.



3. Niuanse korzystania z cyklufor

Ważna uwaga dotycząca używania pętli fororaz operatorów breaki continue.

Instrukcja breakw pętli fordziała tak samo jak w pętli while- powoduje natychmiastowe zakończenie pętli. Ale continueprowadzi to do pominięcia ciała pętli, ale nie statement 2(co zmienia licznik pętli).

Przyjrzyjmy się ponownie, w jaki sposób fori są powiązane while.

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

Jeśli forwywołasz instrukcję w bloku poleceń pętli continue, pozostała część bloku poleceń zostanie pominięta, ale polecenie2 (które działa ze zmienną licznika cykli for) będzie nadal wykonywane.

Wróćmy do naszego przykładu pomijania liczb podzielnych przez 7.

Ten kod zostanie zapętlony Ten kod będzie działał świetnie
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);
}

Kod wykorzystujący pętlę whilenie zadziała - nigdy nie przekroczę 7. Ale kod z pętlą forbędzie działał dobrze.



4. Porównanie pętli for: Java vs Pascal

Nawiasem mówiąc, Pascal ma również pętlę For. Występuje na ogół w prawie wszystkich językach programowania. Dopiero w Pascalu jest to dużo jaśniejsze. Przykłady:

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