For-Schleife

Programmanweisung
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 15. Oktober 2005 um 19:17 Uhr durch RolandIllig (Diskussion | Beiträge) (In C oder [[C-Plusplus|C++]]: Aufgeteilt in ANSI-C und C99/C++). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Viele Programmiersprachen definieren eine For-Schleife als eine Kontrollstruktur, mit der man eine Gruppe von Anweisungen (Block) mit einer bestimmten Anzahl von Wiederholungen ausführen kann.

Es gibt im Wesentlichen zwei Arten von For-Schleifen: Algol-artige und C-artige.

Die Algol-artige For-Schleife

Diese Art der For-Schleife dient in erster Linie dazu, eine Anweisung wiederholt auszuführen. Sie hat folgende Eigenschaften:

  • Die Anzahl der Wiederholungen steht schon beim Eintritt in die Schleife fest.
  • Es gibt eine sogenannte Schleifenvariable, die am Anfang auf den Startwert gesetzt wird und dann jeweils um die Schrittweite verändet wird, bis der Zielwert erreicht ist. Die Schleifenvariable, der Startwert, die Schrittweite und der Endwert müssen numerisch sein.
  • Bei jedem Schritt wird die Anweisung ausgeführt.
  • In einigen Programmiersprachen sind Start- und Endwert auf ganze Zahlen beschränkt.
  • In Pascal ist die Schrittweite auf 1 (Schlüsselwort to) oder   (downto) beschränkt.
  • In einigen anderen Programmiersprachen können der Startwert, der Endwert und die Schrittweite auch gebrochene Zahlen sein.

Die Definition, wie eine For-Schleife auszusehen hat, ist von Programmiersprache zu Programmiersprache verschieden. Die Elemente, aus denen eine For-Schleife besteht, sind aber fast immer dieselben. Auch die Bedeutung einer For-Schleife, also die Art, wie sie ausgeführt wird, ist von Sprache zu Sprache verschieden. Hier einige Beispiele:

Pascal

Eine For-Schleife hat die Form:

for Variable := Startwert [to|downto] Endwert do Anweisung

Die Bedeutung der For-Schleife mit to ist im PASCAL User Manual and Report (ISBN 3-540-06950-X) als äquivalent zu den folgenden Anweisungen definiert.

if Startwert <= Endwert then
begin
  Variable := Startwert;  Anweisung;
  Variable := succ(Variable);  Anweisung;
  ...;
  Variable := Endwert;  Anweisung;
end

Die Ausdrücke Startwert und Endwert werden dabei nur einmal ausgewertet. Aufgrund dieser Definition könnte ein findiger Programmierer jetzt auf die Idee kommen, den Wert der Variable innerhalb der Anweisung zu verändern. Dem schiebt die Sprachbeschreibung von Pascal jedoch einen Riegel vor, denn da steht: „The control variable, the initial value, and the final value must [...] not be altered by the for statement“. Also dürfen auch Startwert und Endwert während der ganzen For-Schleife nicht verändert werden. Viele Programmierer machen das aber trotzdem und erzeugen so Programme, die im strengen Sinne keine Pascal-Programme sind, da sie sich nicht an die Sprachdefinition halten.

Modula-3

Eine For-Schleife hat die Form:

FOR Variable := Startwert TO Endwert [BY Schrittweite] DO Anweisungen END

Die Bedeutung ist die gleiche wie der folgende Code, wobei i, ew und sw Variablen sind, vom Programm aus nicht sichtbar sind.

VAR i := ORD(Startwert); ew := Endwert; sw := Schrittweite;
BEGIN
  IF sw >= 0 THEN
    WHILE i <= ew DO
      WITH Variable = VAL(i, T) DO S; END;
      INC(i, sw);
    END
  ELSE
    WHILE i >= ew DO
      WITH Variable = VAL(i, T) DO S; END;
      DEC(i, sw);
    END
  END
END

Die Unterschiede zur For-Schleife von Pascal sind, dass die Variable in Modula-3 automatisch deklariert wird und dass die Schrittweite nicht auf 1 und   beschränkt ist.

Der Code, durch den diese For-Schleife definiert ist, ist allerdings fehleranfällig, falls der Endwert die größtmögliche Zahl ist. Dadurch kann es entweder zu einer Endlosschleife kommen (auf Rechnern, auf denen die größtmögliche Zahl + 1 die kleinstmögliche ergibt) oder zu einem unerwarteten Programmabbruch. Die Autoren von Modula-3 waren sich dessen bewusst, deshalb steht im Modula-3-Handbuch auch:

If the upper bound of the loop is LAST(INTEGER), it should be rewritten as a WHILE loop to avoid overflow.

Die C-artige For-Schleife

Syntax

In C-artigen Programmiersprachen hat eine For-Schleife diese Form:

for (Initialisierung; Test; Fortsetzung) Anweisung

Semantik

Und so wird sie ausgeführt:

(nach ISO/IEC 9899:1999:)

  1. Der Ausdruck Initialisierung wird ausgewertet. Falls es sich dabei um eine Deklaration handelt, sind die darin definierten Variablen nur innerhalb der For-Schleife gültig.
  2. Der Ausdruck Test wird als boolescher Ausdruck ausgewertet. Falls der Wert false ist, wird die For-Schleife beendet.
  3. Die Anweisung Anweisung wird ausgeführt.
  4. Der Ausdruck Fortsetzung (meistens eine Anweisung) wird ausgewertet.
  5. Es geht mit 2. weiter.

Beispiele

Berechnung der Fakultät)

In Basic (hier: Visual Basic)

Dim Fakultaet as   Long
Fakultaet = 1

For Zaehler = 1 to 5 Step 1
       Fakultaet = Fakultaet * Zaehler
Next

Print Fakultaet 'drucke das Resultat
#include <stdio.h> 

int main(void)
{
      unsigned int Zaehler;
      unsigned long Fakultaet = 1;

      for (Zaehler = 1; Zaehler <= 5; Zaehler++)
             Fakultaet *= Zaehler;

      printf("%lu\n", Fakultaet);

      return 0;
}

In [[C99] oder C++

#include <stdio.h> 

int main(void)
{
      unsigned long Fakultaet = 1;

      for (unsigned int Zaehler = 1; Zaehler <= 5; Zaehler++)
             Fakultaet *= Zaehler;

      printf("%lu\n", Fakultaet);

      return 0;
}
 Program Fakultas;
 var
   Zaehler  : Integer;       // Laufvariable 2..Fakultaet;
   Fakultaet: LongInt;       // Ergebnisvariable
 begin
   Fakultaet := 1;           // Startwert setzen
   for Zaehler := 2 to 5 do  // multipliziere Fakultät mit 2, 3, .., Zaehler
     Fakultaet := Fakultaet * Zaehler;
   writeln(Fakultaet);       // Ausgabe der berechneten Fakultät
 end.
int Fakultät = 1;
for (int Zähler = 1; Zähler <= 5; Zähler++)
      Fakultät = Fakultät * Zähler;
System.out.println("Fakultät=" + Fakultät);
Fakultaet = 1;
for (Zaehler = 1; Zaehler <= 5; Zaehler++)
{
      Fakultaet = Fakultaet * Zaehler;
}
document.write('Fakultaet=' + Fakultaet);
faktorial _ 1.
1 to: 5 do: [ :i | faktorial _ faktorial * i].
Transcript show: faktorial printString

dr maniii

In Perl

use strict;
my $fakultaet = 1;
for (my $zaehler = 1; $zaehler <= 5; $zaehler++) {$fakultaet *= $zaehler;}
print "Fakultät = $fakultaet\n";

Siehe auch