While-Schleife
Bild: Taylor, CC BY-SA 4.0, Wikimedia Commons
Kurz: Eine kopfgesteuerte Schleife, die einen Codeblock so lange wiederholt, wie eine Bedingung zu Beginn jedes Durchlaufs wahr ist — ist die Bedingung von Anfang an falsch, läuft der Block kein einziges Mal.
Genauer: Im Gegensatz zur For-Schleife eignet sich die While-Schleife besonders, wenn die Anzahl der Durchläufe vorher nicht bekannt ist — z. B. beim Warten auf eine Nutzereingabe oder beim Lesen einer Datei bis zu ihrem Ende. Das Gegenstück ist die fußgesteuerte Schleife (do...while), bei der die Bedingung erst nach dem ersten Durchlauf geprüft wird.
Im Detail
solange (bedingung) {
// Codeblock
// MUSS irgendwo die bedingung verändern, sonst Endlosschleife
}Ein typischer Anwendungsfall, bei dem die Anzahl der Durchläufe erst zur Laufzeit feststeht:
zeile = lies_naechste_zeile(datei)
solange zeile != null:
verarbeite(zeile)
zeile = lies_naechste_zeile(datei)Hier weiß man vorab nicht, wie viele Zeilen die Datei hat — die Schleife läuft einfach so lange weiter, bis die Abbruchbedingung (zeile == null, also Dateiende erreicht) eintritt. Bei einer For-Schleife müsste man diese Anzahl dagegen vorab kennen oder künstlich simulieren.
Die häufigste Fehlerquelle bei While-Schleifen ist die vergessene Aktualisierung der geprüften Bedingung — bleibt sie unverändert wahr, entsteht eine Endlosschleife:
i = 0
solange i < 10:
verarbeite(i)
# FEHLT: i = i + 1 -> Endlosschleife!Anders als bei einer for-Schleife, bei der Initialisierung, Bedingung und Aktualisierung meist kompakt in einer Zeile zusammenstehen, ist bei while die Verantwortung für die Aktualisierung vollständig dem Programmierer überlassen und leicht zu übersehen — ein Grund, warum for bei bekannter, fester Durchlaufanzahl meist die sicherere Wahl ist, während while seine Stärke gerade bei unbekannter Durchlaufanzahl ausspielt.
Bewusste Endlosschleifen
Nicht jede Schleife ohne erkennbares natürliches Ende ist ein Fehler — langlaufende Programme wie Server oder Spiele-Hauptschleifen (“Game Loop”) nutzen bewusst eine Endlosschleife (solange wahr:), die nur über eine explizite Abbruchanweisung (z. B. break) an einer bestimmten Stelle im Codeblock verlassen wird, statt die Abbruchbedingung im Schleifenkopf zu formulieren. Das ist sinnvoll, wenn die Abbruchentscheidung erst mitten in der Verarbeitung eines Durchlaufs feststeht, nicht schon zu Beginn.
While vs. rekursive Umsetzung
Fast jede while-Schleife lässt sich alternativ als rekursive Funktion ausdrücken (die Funktion ruft sich selbst mit aktualisiertem Zustand erneut auf, statt eine Schleife zu wiederholen) — funktional äquivalent, aber mit unterschiedlichen praktischen Eigenschaften: Rekursion kann bei sehr vielen Durchläufen den Aufrufstack sprengen (Stack Overflow), eine Schleife nicht. Manche Sprachen (v. a. funktionale Sprachen) optimieren bestimmte rekursive Muster (“Tail-Call-Optimierung”) so, dass dieses Risiko entfällt — in vielen verbreiteten Sprachen (darunter Java) existiert diese Optimierung aber nicht, weshalb dort für einfache Wiederholungen meist while/for gegenüber Rekursion bevorzugt wird.
Siehe auch: Schleifen, Kopfgesteuerte Schleife, Fußgesteuerte Schleife, Rekursion