C++ Kurs

for-Schleife

Die Themen:

Syntax

Sollen Anweisungen wiederholt ausgeführt werden, so werden hierfür Schleifen eingesetzt. In diesem Kapitel werden wir uns eine der beiden Schleifentypen ansehen, die for-Schleife.

Die for-Schleife wird hauptsächlich dann eingesetzt, wenn bereits vor dem Eintritt in die Schleife bekannt ist, wie oft die in ihr enthaltenen Anweisungen ausgeführt werden sollen. Die for-Schleife hat folgende Syntax:

for (AUSRUCK1; AUSDRUCK2; AUSDRUCK3)
   AKTION;

Die drei Ausdrücke in der Klammer werden jeweils durch ein Semikolon voneinander getrennt und nach der schließenden Klammer der for-Schleife steht kein Semikolon. Sehen wir uns nun Schritt für Schritt den Aufbau der Schleife an.

Initialisierungsausdruck

Der erste Ausdruck innerhalb der Klammer ist der Initialisierungsausdruck. Er wird nur einmal ausgeführt und zwar bevor die Schleifenaktion das erste Mal ausgeführt wird.


for (auto index=0; ... ; ...)
   AKTION;

Im Regelfall initialisiert er eine Schleifenvariable, d.h. er legt einen Startwert fest, mit dem die Schleife begonnen wird. Im Beispiel definierte der Initialisierungsausdruck die Variable index und initialisiert sie mit dem Wert 0. Eine der Art in der for-Schleife definierte Variable ist auch nur in der Schleife gültig.

Der Initialisierungsausdruck kann auch aus mehreren Anweisungen bestehen. Die Anweisungen werden dann durch Kommas (kein Semikolon!) getrennt, so wie unten dargestellt. Selbstverständlich muss die Variable count vorher irgendwo definiert worden sein.


for (count=10, auto loop=0; ... ; ...)
   AKTION;

Abbruchbedingung

Der nächste Ausdruck legt die Abbruchbedingung der Schleife fest, d.h. unter welcher Bedingung die Schleife beendet wird. Dieser Ausdruck ist in der Regel ein vergleichender Ausdruck. Die Schleife wird dann so lange durchlaufen, wie die Auswertung dieses Ausdrucks true ergibt.


for (auto index=0; index<10; ...)
   AKTION;

count = 10;
for (auto loop=0; count<10; ...)
   AKTION;
Ergibt die Auswertung der Abbruchbedingung schon vor dem Eintritt in die Schleife false, so wird die Schleifenaktion überhaupt nicht ausgeführt! Dies ist z.B. in der zweiten for-Schleife oben der Fall.

Die Abbruchbedingung kann auch mehreren Bedingungen bestehen, die dann durch entsprechende logische Operatoren verknüpft werden. Im nachfolgenden Beispiel wird die erste for-Schleife so lange durchlaufen, solange index kleiner 10 ist und done gleich false (Negation beachten!). Die zweite for-Schleife enthält eine 'hinterlistige' Falle: der Compiler meldet Ihnen hier keinen Fehler, höchsten eine Warnung. Hier werden die Ergebnisse der beiden Ausdrücke bitweise verundet, und das ist nun einmal etwas anderes wie eine logische Verundung.


for (auto index=0, auto done=false; (index<10) && (!done); ...)
   AKTION;
// Aber nie so!
for (auto index=0, auto done=false; (index<10) & (!done); ...)
   AKTION;

Die Anzahl der Bedingungen, die in einer for-Schleife stehen können, ist nicht begrenzt. Jedoch wird es bereits ab 3 Bedingungen schon etwas unübersichtlich und damit später auch schwerer zu lesen. Versuchen Sie deshalb die Anzahl der Bedingung zu minimieren.

Und noch ein Hinweis bevor wir zum letzten Ausdruck übergehen: setzen Sie die einzelnen Bedingungen immer in Klammern. Dies ist zwar keine Vorschrift, jedoch vermeiden die Klammern wieder unliebsame Überraschungen in Bezug auf die Rangfolge der Operatoren.

Schleifenaktion

Der letzte Ausdruck in der Schleifenklammer legt die Aktion fest, die nach dem Ausführen der Schleifenanweisung (wird im Anschluss beschrieben) und vor dem erneuten Auswerten der Abbruchbedingung ausgeführt wird.


for (auto index=0; index<10; index++)
   AKTION;

In der Regel wird hier die mit dem ersten Ausdruck initialisierte Schleifenvariable verändert. Auch dieser Ausdruck kann aus mehreren Anweisungen bestehen, die wieder durch Kommas getrennt werden. Der Lesbarkeit wegen sollte hier wirklich nur die Schleifenvariable beeinflusst werden und alles andere in der, im Anschluss beschriebenen, Schleifenanweisung durchgeführt werden.

Jeder der 3 Ausdrücke, Schleifeninitialisierung, Abbruchbedingung und Schleifenaktion, ist optional, jedoch müssen die beiden Semikolon innerhalb der Klammer immer angegeben werden. Eine for-Schleife ohne Abbruchbedingung und 'Notausgang' erzeugt eine Endlos-Schleife.


for (AUSDRUCK1; ;AUSDRUCK3)
   AKTION;

Schleifenanweisung

Kommen wir nun zum letzten Teil der for-Schleife, der Schleifenanweisung. Die Schleifenanweisung besteht standardmäßig nur aus einer einzigen Anweisung. Sollen mehrere Anweisungen ausgeführt werden, was auch fast immer der Fall ist, so sind die Anweisungen in einen Block {...} einzuschließen. Auch die Angabe einer Schleifenanweisung ist (zumindest in der Theorie) optional. Aus diesem Grund liefert die dritte dargestellte for-Schleife beim Übersetzen auch keinen Fehler. Hier wird einfach 10-mal nichts getan außer die Schleifenvariable zu erhöhen. Gute Compiler (und die meisten sind gut!) optimieren eine solche Schleife weg. Und noch bessere Compiler geben zusätzlich auch noch eine Warnung aus.


// Schleife mit einer Schleifenanweisung
for (auto index=0; index<10; index++)
    cout << "Schleifenzähler: " << index << endl;

// Schleife mit mehreren Schleifenanweisungen
for (auto index=0; index<10; index++)
{
   ... // Hier können jetzt mehrere
   ... // Anweisungen stehen
}

// Aber Achtung! Leerschleife
for (auto index=0; index<10; index++);
   cout << "Schleifenzähler: " << index << endl;
HinweisEs gibt noch eine zweite Form der for-Schleife, die range-for Schleife. Ihr Einsatzgebiet ist das Durchlaufen von Felder bzw. Container. Aus diesem Grund erfolgt die Beschreibung der range-for Schleife erst später an entsprechender Stelle.

Beispiel und ÜbungUnd hier geht's zum Beispiel und zur Übung.