Ich habe zwei for-Schleifen, die so verschachtelt sind:
for(...) {
for(...) {
}
}
Ich weiß, dass es eine break
Aussage gibt. Aber ich bin verwirrt darüber, ob es beide Schleifen durchbricht oder nur die, in der es aufgerufen wurde? Ich muss beide brechen, sobald ich sehe, dass es keinen Sinn macht, mehrmals zu iterieren.
c
objective-c
loops
Vielen Dank
quelle
quelle
!dobreak
ist am falschen Ort; es sollte in den bedingten (für den zweiten Teil) und nicht in den Inkrementierungsschritt (für den dritten Teil von) gehen; Ich würde auch verwenden!dobreak && ..
, damit die anderen Bedingungen beim Brechen nicht bewertet werden müssen. Ich stimme mit sigjuice:goto
ist nicht böse , wenn sie richtig verwendet wird , und dies ist ein Fall , in demgoto
tut machen für eine bessere Code.break
durch einecontinue
Anweisung ersetzt wird. Trotzdem ist es eher nicht offensichtlich, worüber man sich Sorgen machen muss.Wenn die Verwendung von goto den Code vereinfacht, ist dies angemessen.
for (;;) { for (;;) { break; /* breaks inner loop */ } for (;;) { goto outer; /* breaks outer loop */ } } outer:;
quelle
for (;;) {for (;;) {break; /* breaks inner loop */} for (;;) {goto outer; /* breaks outer loop */}} outer:;
Die
break
Anweisung bringt Sie nur aus der innersten Schleife heraus. Wenn Sie den zusätzlichen Aufwand für Code, Speicher und Leistung einer dedizierten Statusvariablen nicht möchten, empfehle ich, den Code in eine eigene Funktion oder Methode umzuwandeln und zu verwendenreturn
, um aus allen Schleifen herauszukommen:void do_lots_of_work(void) { int i, j; for(i=0; i<10 ; i++) { for(j=0;j< 10; j++) { .. .. if(disaster_struck()) return; /* Gets us out of the loops, and the function too. */ } } }
quelle
goto
. Leistungsbedenken sollten auch in der Praxis nicht beachtet werden.Anders als die bereits erwähnte Flagvariable oder Springen Sie könnten werfen eine Objective-C Ausnahme:
@try { for() { for() { @throw ... } } } @catch{ ... }
quelle
Andere haben erwähnt, wie Sie ein Flag setzen oder ein verwenden können
goto
, aber ich würde empfehlen, Ihren Code so umzugestalten, dass die innere Schleife in eine separate Methode umgewandelt wird. Diese Methode kann dann ein Flag zurückgeben, um anzuzeigen, dass die äußere Schleife solltebreak
. Wenn Sie Ihre Methoden entsprechend benennen, ist dies viel besser lesbar.for (int i = 0; i < 10; i++) { if (timeToStop(i)) break; } -(bool) timeToStop: (int) i { for (int j = 0; j < 10; j++) { if (somethingBadHappens) return true; } return false; }
Pseudocode, nicht getestet, aber Sie bekommen die Idee.
quelle
Die break-Anweisung bricht nur aus der Schleife im Bereich aus, die die übergeordnete Schleife ist. Wenn Sie auch aus der zweiten Schleife ausbrechen möchten, können Sie eine boolesche Variable verwenden, die für beide Schleifen gilt
bool isTerminated = false; for (...) { if (!isTerminated) { for(...) { ... isTerminated = true; break; } } else { break; } }
quelle
Ändern Sie den Zähler der oberen Schleife vor der Pause
for(i=0; i<10 ; i++) for(j=0;j< 10; j++){ .. .. i = 10; break; }
quelle
NSUInteger limit = 10;
Dann:for(i=0; i<limit; i++) { for(j=0; j<10; j++) { .. .. i = limit; break; } }
Der wahrscheinlich einfachste Weg ist die Verwendung einer "Flag" -Variablen
for(i=0; i<10 && (done==false); i++) for(j=0;j< 10; j++){ .. .. if(...){done=true; break;} }
quelle
fast-enumeration
Schleifen in Obj-CEine andere Lösung besteht darin, die zweite Schleife in einer Funktion herauszufiltern:
int i; for(i=0; i<10 ; i++){ if !innerLoop(i) { break; } } bool innerLoop(int i) int j; for(j=0;j< 10; j++){ doSomthing(i,j); if(endcondtion){ return false; } } }
quelle
Die break-Anweisung bricht aus der innersten Schleife aus. Eine zusätzliche Test- und Unterbrechungsanweisung wäre erforderlich, um aus der äußeren Schleife auszubrechen.
quelle
Wenn eine Unterbrechung innerhalb einer Reihe verschachtelter Schleifen ausgeführt wird, wird nur die innerste Schleife beendet, in der die Unterbrechung ausgeführt wird. (Genau wie Standard C)
quelle
Genau wie die letzten, im Allgemeinen so:
for(i=0;i<a;i++){ for(j=0;j<a;j++){ if(Something_goes_wrong){ i=a; break; } } }
quelle
Wie wäre es, wenn Sie diese True / False-Prüfung in eine Methode umwandeln und
return
Anweisungen verwenden:- (bool) checkTrueFalse: parameters{ for ( ...) { for ( ... ) { if (...) { return true; } } } return false; }
quelle