6.4 Kontrolliertes Verlassen von Schleifen
Wenn Sie eine Schleife beenden oder wieder an den Anfang des Schleifenkopfes springen möchten, können Sie die Schlüsselwörter break oder continue verwenden.
6.4.1 break
Das Schlüsselwort break haben Sie bereits bei der switch-Fallunterscheidung kennengelernt. break kann auch verwendet werden, um eine for-, while- oder do-while-Schleife vorzeitig zu verlassen. Beachten Sie dabei, dass bei einer verschachtelten Schleife nur die innerste Schleife abgebrochen wird.
Hier ein einfaches Beispiel zum Schlüsselwort break:
00 // Kapitel6/break.c
01 #include <stdio.h>
02 int main(void) {
03 int ival = 0;
04 while( 1 ) {
05 printf("Raus geht es mit 5: ");
06 if( scanf("%d", &ival ) != 1 ) {
07 printf("Fehler bei der Eingabe...\n");
08 break;
09 }
10 if( ival == 5 ) {
11 break;
12 }
13 }
14 printf("Programmende\n");
15 return 0;
16 }
Aus der Endlosschleife in den Zeilen (04) bis (13) kommen Sie nur dann heraus, wenn Sie den numerischen Wert 5 eingeben und die if-Bedingung in Zeile (10) wahr ist. Erst dann wird die break-Anweisung in Zeile (11) ausgeführt, und in diesem Fall wird die while-Schleife verlassen und mit der Programmausführung in Zeile (14) fortgefahren. Alternativ wird hier die Schleife in Zeile (08) ebenfalls mit break abgebrochen, wenn bei der Eingabe von scanf() in Zeile (06) kein gültiger Wert eingegeben wurde und der Rückgabewert nicht 1 ist.
Allerdings besteht bei einem solchen Beispiel keine Notwendigkeit, eine break-Anweisung zu verwenden. Die Schleife aus dem Listing 6.5 in den Zeilen (04) bis (13) hätte auch wie folgt erstellt werden können:
int ival = 0;
while( ival != 5 ) {
printf("Raus geht es mit 5: ");
if( scanf("%d", &ival ) != 1 ) {
printf("Fehler bei der Eingabe...\n");
break;
}
}
6.4.2 continue
Mit dem Schlüsselwort continue können Sie im Gegensatz zum Schlüsselwort break den Rest des aktuellen Schleifendurchlaufs überspringen und mit dem nächsten Schleifendurchlauf fortfahren. Hierzu ein Beispiel:
00 // Kapitel6/continue.c
01 #include <stdio.h>
02 int main(void) {
03 int sum=0;
04 for(int ival=0; ival <= 20; ival++) {
05 if(ival % 2) {
06 continue;
07 }
08 sum+=ival;
09 }
10 printf("Summe gerader Zahlen: %d\n", sum);
11 return 0;
12 }
In diesem Beispiel wird die Summe aller geraden Zahlen bis 20 addiert. Ist der Wert der Schleifenvariablen in Zeile (05) eine ungerade Zahl, wird von der Modulo-Operation ein Rest zurückgegeben, sodass diese Bedingung wahr (ungleich 0) ist. In diesem Fall wird mithilfe von continue in Zeile (06) wieder zum nächsten Schleifendurchlauf von for zurückgesprungen, und Zeile (08) dahinter – das Addieren von geraden Ganzzahlen – wird nicht ausgeführt.
Auch in diesem Beispiel könnten Sie auf die continue-Anweisung verzichten. Dieselbe Schleife, nur jetzt ohne die continue-Anweisung, könnten Sie wie folgt realisieren:
for(int ival=0; ival <= 20; ival++) {
if(! (ival % 2) ) {
sum+=ival;
}
}
Ein kleiner Tipp zur Codeoptimierung
Nun noch ein kleiner Tipp zur Codeoptimierung: Wenn Sie sich den logischen Sachverhalt des Listings noch etwas genauer ansehen, könnten Sie auch auf die if-Verzweigung verzichten und gleich dafür sorgen, dass beim Hochzählen in der Schleife immer nur gerade Zahlen verwendet werden. Somit könnten Sie mit folgendem Schleifenkonstrukt auf alle if-Überprüfungen und die Hälfte der Schleifendurchläufe verzichten.
Wenn Sie den Tipp in dem vorigen Kasten anwenden, dann erhalten Sie folgenden Codeabschnitt:
for(int ival=0; ival <= 20; ival+=2) {
sum+=ival;
}
Schleifen ohne Anweisungsblock
Besitzt der Schleifenrumpf nur eine Anweisung, können Sie den Anweisungsblock mit { ... } auch weglassen. Ein Anweisungsblock ist nur dann nötig, wenn mehrere Anweisungen zu einem Block zusammengefasst werden müssen.