Wenn ich eine break
Anweisung verwende, wird nur die innere Schleife unterbrochen, und ich muss ein Flag verwenden, um die äußere Schleife zu unterbrechen. Wenn es jedoch viele verschachtelte Schleifen gibt, sieht der Code nicht gut aus.
Gibt es eine andere Möglichkeit, alle Schleifen zu durchbrechen? (Bitte nicht benutzen goto stmt
.)
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
user966379
quelle
quelle
Antworten:
Verwenden:
quelle
const int count =1000
in der globalen Initialisierung a verwendet haben ? oder als#define
Makro.Nein, verdirb den Spaß nicht mit einem
break
. Dies ist die letzte noch gültige Verwendung vongoto
;)Wenn dies nicht der Fall ist, können Sie Flags verwenden, um aus tief verschachtelten Schleifen auszubrechen.
Ein anderer Ansatz zum Ausbrechen einer verschachtelten Schleife besteht darin, beide Schleifen in eine separate Funktion zu zerlegen und von dieser Funktion zurückzukehren, wenn Sie sie beenden möchten.
Zusammengefasst - um aus verschachtelten Schleifen auszubrechen:
goto
Konnte nicht widerstehen, xkcd hier aufzunehmen :)
Quelle
Goto's gelten als schädlich, aber wie viele Leute in den Kommentaren vermuten, muss es nicht sein. Wenn es mit Bedacht eingesetzt wird, kann es ein großartiges Werkzeug sein. Alles, was in Maßen verwendet wird, macht Spaß.
quelle
quelle
Eine Möglichkeit besteht darin, alle verschachtelten Schleifen in eine Funktion zu setzen und von der innersten Schleife zurückzukehren, falls alle Schleifen ausbrechen müssen.
quelle
Ich denke,
goto
wird das Problem lösenquelle
Sie benötigen eine boolesche Variable, wenn Sie sie lesbar haben möchten:
Wenn Sie möchten, dass es weniger lesbar ist, können Sie sich der booleschen Bewertung anschließen:
Als ultimative Möglichkeit können Sie die anfängliche Schleife ungültig machen:
quelle
Verwenden Sie diesen weisen Rat des LLVM-Teams:
"Prädikatenschleifen in Prädikatenfunktionen verwandeln"
Sehen:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
quelle
Achtung: Diese Antwort zeigt eine wirklich dunkle Konstruktion.
Wenn Sie GCC verwenden, überprüfen Sie diese Bibliothek .
break
Kann wie in PHP die Anzahl der verschachtelten Schleifen akzeptieren, die Sie beenden möchten. Sie können so etwas schreiben:quelle
goto
:)goto
) weitaus besser ist, um asm inline zu verwenden (maschinenspezifisch, leichter Fehler zu machen, schwerer zu lesen, ...).quelle
Wenn Sie die Werte von i und j benötigen, sollte dies funktionieren, jedoch mit weniger Leistung als bei anderen
quelle
j
ist, der Wert der Bedingung auf irgendeine Weise gespeichert werden muss, damit dies weiterhin funktioniert.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
geht zu immer bricht aus der äußeren Schleife nach der ersten Iteration der inneren Schleife.Bricht beide Schleifen.
quelle
quelle
condition
falsch wird. Oh, und die zweite Schleife wird für immer laufen, weil sie statt inkrementierti
wirdj
, whoops ...quelle