Pętla For


Instrukcja for, inaczej niż repeat lub while, wymaga wyspecyfikowania dokładnej liczby wykonywanych cykli.

Składnia instrukcji:

 for licznik := wStart to wStop do instr;

lub

 for licznik := wStart downto wStop do instr;

gdzie:

Instrukcja for przypisuje zmiennej licznik wartość wStart, po czym powtarza wykonanie instrukcji instr zwiększając, badź zmniejszając wartość zmiennej licznik po każdej iteracji. (Postać for...to zwiększa licznik, zaś składnia for...downto zmniejsza licznik.) Kiedy licznik osiąga wartość wStop, instr wykonywana jest po raz ostatni, po czym pętla for kończy swe działanie. Innymi sławy, instr jest wykonywana dla każdej kolejnej wartości zmiennej licznik z zakresu od wStart do wStop. Jeśli wStart jest równe wStop, instr wykonywana jest tylko raz. Jeśli wStart jest większe niż wStop w pętli o składni for...to, lub jeśli wStart jest mniejsze niż wStop w pętli o składni for...downto, instr nie jest wykonywane nigdy. Z uwagi na różne implementacje pętli for w różnych wersjach Pascala, należy przyjąć, że po zakończeniu działania pętli, wartość zmiennej licznik jest nieokreślona.

Wartości wyrażeń wStart i wStop są wyznaczane tylko raz, jeszcze przed pierwszym cyklem pętli. Dlatego pętla for...to jest niemal (lecz nie całkiem) równoważna następującej konstrukcji while:

  licznik := wStart;
  while licznik <= wStop do
  begin
    instr;
    licznik := Succ(licznik);
  end;

Różnica polega na tym, że w powyższej konstrukcji pętla while wyznacza wartość wyrażenia wStop przed każdą iteracją. Może to skutkować relatywnym spowolnieniem wykonania pętli, zwłaszcza jeśli wStop jest złożonym wyrażeniem. Ponadto zmiany wartości wyrażenia wStop dokonane we wnętrzu pętli, mogą wpłynąć na wykonanie pętli.

Przykłady:

for i := 2 to 63 do
  if Data[i] > Max then
    Max := Data[i];
for i := ListBox1.Items.Count - 1 downto 0 do
  ListBox1.Items[i] := UpperCase(ListBox1.Items[i]);
for i := 1 to 10 do
  for j := 1 to 10 do
  begin
    X := 0;
    for k := 1 to 10 do
      X := X + Mat1[i, k] * Mat2[k, j];
    Mat[i, j] := X;
  end;
for c := Red to Blue do Check(c);