6.2    Die kopfgesteuerte while-Schleife

Die while-Schleife ist eine kopfgesteuerte Schleife und führt einen Block von Anweisungen so lange aus, wie die Schleifenbedingung wahr ist. Die Syntax der while-Schleife sieht folgendermaßen aus:

while( Ausdruck ) {
Anweisung(en)
}

Bevor also ein Schleifendurchlauf gestartet wird, wird zunächst Ausdruck ausgewertet. Solange und erst wenn dieser wahr ist (ungleich 0), werden die Anweisungen im Schleifenrumpf ausgeführt. Ist die Schleifenbedingung von Anfang an unwahr (gleich 0), wird die Schleife sofort beendet, und das Programm fährt auch sofort mit der Ausführung direkt dahinter fort. Genau deswegen nennt man diesen Schleifentyp kopfgesteuert, weil zuerst der Kopf ausgewertet wird. Der typische Programmablaufplan für die while-Schleife sieht demnach aus wie in Abbildung 6.2.

Programmablaufplan der while-Schleife

Abbildung 6.2    Programmablaufplan der while-Schleife

Auch hierzu folgt ein einfaches Beispiel:

00  // Kapitel6/while.c
01 #include <stdio.h>

02 int main(void) {
03 int ival = 10;
04 while( ival > 0 ) {
05 if( ival % 2 ) {
06 printf("%d ", ival);
07 }
08 ival--;
09 }
10 printf("\n");
11 return 0;
12 }

Listing 6.3    while.c demonstriert die Verwendung der while-Schleife.

In Zeile (03) wird die Schleifenvariable ival mit dem Wert 10 initialisiert. Eine Zeile weiter folgt die erste while-Schleife. Es wird erst die Bedingung überprüft, also ob der Wert von ival größer als 0 ist. Solange diese Bedingung wahr ist (ungleich 0), wird der Schleifenrumpf in den Zeilen (05) bis (09) ausgeführt. In der Schleife selbst wird in Zeile (05) lediglich mit dem Modulo-Operator überprüft, ob der aktuelle Wert von ival durch 2 geteilt einen Rest ergibt. Ist dies der Fall, handelt es sich um eine ungerade Zahl, und diese geben Sie in Zeile (06) aus. Ansonsten wird nichts ausgegeben.

Umwandlung von while- zu for-Schleifen

Aus jeder while-Schleife können Sie natürlich immer auch eine for-Schleife formen. Umgekehrt funktioniert dies genauso. Welche Form Sie lieber verwenden, ist Geschmackssache, und es gibt Programmierer, die stets nur eine Variante verwenden. Wundern Sie sich also nicht, wenn Sie in fremdem Code Vorlieben für den einen oder anderen Typ entdecken, aber auch über Programmiergeschmäcker lässt sich streiten.

In jedem Schleifendurchlauf wird – und das ist in diesem Beispiel besonders wichtig – der Wert von ival in Zeile (08) um 1 reduziert. Ohne diese Dekrementierung würde sich die Schleife nie mehr ohne fremde Hilfe beenden lassen – die Abbruchbedingung würde nie erreicht. Selbstredend ist genau diese Art der Endlosschleife einer der Hauptgründe für schwer zu findende Bugs, vor allem, wenn dann in den Abbruchbedingungen noch verschachtelte logische Ausdrücke auftauchen. Nachdem der Wert von ival um 1 reduziert worden ist, springt das Programm zurück zum Schleifenanfang in Zeile (04), wo die Abbruchbedingung erneut überprüft wird. Dieser Vorgang wird so lange ausgeführt, bis die Bedingung in Zeile (04) unwahr ist (gleich 0). Trifft dies zu, wird mit der Ausführung des Programms hinter dem Rumpf der while-Schleife mit Zeile (10) fortgefahren.

Das Programm gibt bei der Ausführung Folgendes aus:

9 7 5 3 1