Break und Continue in Rust
Mit break und continue unterbrichst du eine Schleife vorzeitig, statt sie immer bis zum Ende laufen zu lassen. Beide funktionieren in allen drei Schleifenarten gleich: loop, while und for.
break – die Schleife ganz verlassen
Abschnitt betitelt „break – die Schleife ganz verlassen“break stoppt die Schleife sofort. Das Programm macht direkt mit dem weiter, was nach der Schleife kommt:
fn main() { for i in 1..=10 { if i == 5 { break; } println!("{i}"); }}Ausgabe:
1234Obwohl der Bereich bis 10 geht, hört die Schleife in dem Moment auf, in dem i die 5 erreicht.
continue – weiter zur nächsten Runde
Abschnitt betitelt „continue – weiter zur nächsten Runde“continue überspringt den Rest des aktuellen Durchlaufs und springt direkt zum nächsten. Die Schleife selbst läuft weiter:
fn main() { for i in 1..=10 { if i % 2 == 0 { continue; // gerade Zahlen überspringen } println!("{i}"); }}Ausgabe:
13579Jede gerade Zahl wird übersprungen: continue greift, und die Schleife geht sofort zum nächsten Wert von i, ohne println! auszuführen.
Schleifen mit Labels
Abschnitt betitelt „Schleifen mit Labels“Steckt eine Schleife in einer anderen, wirken break und continue nur auf die innerste Schleife. Willst du aus einer verschachtelten Schleife heraus die äußere verlassen, gib der äußeren Schleife ein Label (eine Marke). Du schreibst es als 'name::
fn main() { 'outer: for x in 1..=3 { for y in 1..=3 { if x * y > 4 { break 'outer; } println!("{x} x {y} = {}", x * y); } }}Ausgabe:
1 x 1 = 11 x 2 = 21 x 3 = 32 x 1 = 22 x 2 = 4Ohne das Label würde break nur die innere y-Schleife stoppen, und x würde weiterlaufen. break 'outer; stoppt beide auf einmal. continue 'outer; funktioniert genauso – damit springst du zur nächsten Runde der äußeren Schleife, statt ganz aufzuhören.
Die continue-Falle in while-Schleifen
Abschnitt betitelt „Die continue-Falle in while-Schleifen“In einer for-Schleife kommt der nächste Wert automatisch aus dem Bereich, continue ist dort also immer sicher. Bei einer while-Schleife ist das anders: Du aktualisierst den Zähler, meist ganz unten im Rumpf. Springt continue über diese Aktualisierung hinweg, ändert sich der Zähler nie, und die Schleife läuft endlos.
Diese Version soll die 3 überspringen, bleibt aber hängen. Führ sie nicht aus:
fn main() { let mut i = 0; while i < 5 { if i == 3 { continue; // ❌ springt zurück nach oben, ohne i zu ändern } println!("{i}"); i += 1; }}Wenn i gleich 3 ist, springt continue zurück zur Bedingung. i ist immer noch 3, also greift continue wieder und wieder – für immer. Die Lösung: Aktualisiere den Zähler vor allem, was continue auslösen könnte:
fn main() { let mut i = 0; while i < 5 { i += 1; // zuerst erhöhen, damit continue es nicht überspringen kann if i == 3 { continue; } println!("{i}"); }}Ausgabe:
1245Wenn du i += 1 nach oben verschiebst, verschieben sich die Zahlen um eins: Diese Schleife gibt 1 bis 5 aus statt 0 bis 4. Pass also den Startwert oder die Bedingung an, wenn du den alten Bereich brauchst. Noch besser: Wenn du nur zählst, nimm eine for-Schleife über einen Bereich – dann kann das Problem gar nicht erst auftreten.
Übungen
Abschnitt betitelt „Übungen“1. Vielfache von 3 überspringen
Abschnitt betitelt „1. Vielfache von 3 überspringen“Gib die Zahlen von 1 bis 10 aus, aber überspring jedes Vielfache von 3. Tipp: Eine Zahl ist ein Vielfaches von 3, wenn n % 3 == 0 gilt. Überspring sie mit continue.
Lösung anzeigen
fn main() { for n in 1..=10 { if n % 3 == 0 { continue; } println!("{n}"); }}Ausgabe:
124578102. Ein Paar finden, dessen Produkt 24 ist
Abschnitt betitelt „2. Ein Paar finden, dessen Produkt 24 ist“Nimm zwei verschachtelte for-Schleifen, x und y, beide über 1..=9. Finde das erste Paar mit x * y == 24, gib es aus und stoppe beide Schleifen. Tipp: Gib der äußeren Schleife ein Label und nimm break 'outer;.
Lösung anzeigen
fn main() { 'outer: for x in 1..=9 { for y in 1..=9 { if x * y == 24 { println!("Gefunden: {x} x {y} = 24"); break 'outer; } } } println!("Suche beendet");}Ausgabe:
Gefunden: 3 x 8 = 24Suche beendetErsetz break 'outer; einmal durch ein einfaches break;. Dann stoppt nur die innere Schleife, die Suche geht weiter, und es werden auch 4 x 6, 6 x 4 und 8 x 3 ausgegeben.
Zusammenfassung
Abschnitt betitelt „Zusammenfassung“breakverlässt die Schleife sofort.continueüberspringt den Rest des aktuellen Durchlaufs und macht mit dem nächsten weiter.- Mit einem Label (
'outer:) könnenbreakundcontinueaus einer verschachtelten Schleife heraus eine äußere Schleife ansteuern. - Aktualisiere in einer
while-Schleife deinen Zähler vor jedemcontinue, sonst kann die Schleife für immer hängen bleiben.
Kurzer Check
Abschnitt betitelt „Kurzer Check“Kurzer Check
1. Was macht continue in einer Schleife?
2. Wie schreibst du ein Label an eine Schleife, damit break sie aus einer verschachtelten Schleife heraus ansteuern kann?
3. Eine while-Schleife mit continue endet nie. Was ist die wahrscheinlichste Ursache?
Punkte: 0 / 3
Weiterlesen
Abschnitt betitelt „Weiterlesen“- Schleifenlabel zur eindeutigen Unterscheidung – Das Rust-Buch: die offizielle Einführung in Labels, mit einem verschachtelten Countdown als Beispiel.
- Nesting and labels – Rust by Example (auf Englisch): ein kurzes, ausführbares Beispiel für
break 'outerundcontinue 'outer. - Loop Labels – The Rust Reference (auf Englisch): die genauen Regeln dafür, wo Labels erlaubt sind.
break-Ausdrücke – The Rust Reference (auf Englisch): wiebreakfunktioniert, auchbreakmit einem Wert.continue-Ausdrücke – The Rust Reference (auf Englisch): wascontinuein jeder Schleifenart bewirkt.