Endlosschleifen
Wenn die Bedingung einer while-Schleife nie falsch wird, endet die Schleife nie. Das nennt man Endlosschleife, und sie ist einer der häufigsten Fehler bei Schleifen. Hier fehlt die Zeile zahl++:
int zahl = 1;
while (zahl <= 5) {
printf("%d\n", zahl);
}zahl bleibt 1, die Bedingung zahl <= 5 ist immer wahr, und das Programm gibt immer wieder 1 aus:
1
1
1
1
...Auf deinem eigenen Computer würde so ein Programm laufen, bis du es beendest. In diesen Übungen wird es nach 5 Sekunden angehalten, und du siehst die Meldung Das Programm lief zu lange und wurde angehalten. Enthält es eine Schleife, die nie endet? Wenn du sie siehst, prüfe jede Schleife: Verändert etwas in ihrem Block die Variable aus der Bedingung, sodass die Bedingung irgendwann falsch wird?
Typische Ursachen:
- Nichts verändert die Variable, wie im Beispiel oben.
- Die Variable ändert sich in die falsche Richtung. Ein Countdown
while (zahl >= 1)mitzahl++stattzahl--machtzahlimmer größer, und die Bedingung bleibt wahr. - Die Änderung steht außerhalb des Blocks. Es wiederholt sich nur der Code zwischen den geschweiften Klammern. Wenn
zahl++unter der schließenden Klammer}landet, wird es erst nach der Schleife ausgeführt, und dazu kommt es nie. - Ein Semikolon nach der Bedingung.
while (zahl <= 5);endet mit einem Semikolon, und dieses Semikolon ist alles, was die Schleife wiederholt: eine leere Anweisung, für immer. Der Block in geschweiften Klammern darunter gehört gar nicht zur Schleife. Das Programm gibt nichts aus und wird nach 5 Sekunden angehalten. Setze nie ein Semikolon zwischen)und{. - Die Bedingung verfehlt ihr Ziel. Eine Bedingung mit
!=(ungleich) ist für jede Zahl außer einer wahr. Wenn die Variable über diese eine Zahl hinwegspringt, läuft die Schleife ewig weiter. Deshalb verwenden Zählschleifen meistens<,<=,>oder>=: Sie enden auch dann, wenn die Variable über die Grenze hinausspringt.
Manchmal siehst du statt der Meldung über die zu lange Laufzeit RuntimeError: unreachable. Du kennst sie aus der Lektion über Variablen: Eine Zahl wurde zu groß für einen int (größer als 2147483647, etwa zwei Milliarden). In einer Endlosschleife passiert das meistens, wenn die Schleife nur rechnet und nichts ausgibt. Dann läuft sie sehr schnell, und eine Variable wächst weiter, bis sie nicht mehr hineinpasst. Die Lösung ist dieselbe: Finde die Schleife, die nie endet.
So schreibst du es:
Anweisungen
- 1
Das Programm im Editor soll die ungeraden Zahlen von 1 bis 9 und dann
Fertigausgeben. Führe es aus: Es hört nicht von selbst auf und wird nach 5 Sekunden angehalten. Finde heraus, warum die Bedingung nie falsch wird, und behebe den Fehler, sodass das Programm1,3,5,7,9undFertigausgibt, jedes in einer eigenen Zeile.