Wie kann ich in Objective-C aus zwei verschachtelten for-Schleifen ausbrechen?
Lesezeit: 4 Minuten
Vielen Dank
Ich habe zwei for-Schleifen, die wie folgt verschachtelt sind:
for(...) {
for(...) {
}
}
Ich weiß, dass es eine gibt break Aussage. Aber ich bin verwirrt darüber, ob es beide Schleifen unterbricht oder nur die, in der es aufgerufen wurde? Ich muss beide brechen, sobald ich sehe, dass es keinen Sinn macht, mehrmals zu iterieren.
Ori Pessach
Wenn die Verwendung von goto den Code vereinfacht, wäre dies angemessen.
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
Um dies zu erweitern, for (;;) {for (;;) {break; /* breaks inner loop */} for (;;) {goto outer; /* breaks outer loop */}} outer:;
– vergänglich
14. Mai 2009 um 13:46 Uhr
(;;) sieht aus wie ein kleines Gesicht.
– Zak-Tänze
28. März 2013 um 19:14 Uhr
jbasko
break bricht aus einer Schleife heraus, aber Sie können der äußeren Schleife ein Häkchen hinzufügen, das bricht, wenn die innere bricht.
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
IMHO ist die Verwendung von goto viel sauberer.
– Sigissaft
14. Mai 2009 um 19:03 Uhr
!dobreak ist am falschen Ort; es sollte eher in den Bedingungsschritt (zweiter Teil von for) als in den Inkrementschritt (dritter Teil von for) gehen; würde ich auch verwenden !dobreak && .., so dass die anderen Bedingungen beim Brechen nicht ausgewertet werden müssen. Ich stimme Sigjuice zu: goto ist nicht böse, wenn es richtig verwendet wird, und dies ist ein Fall, in dem gototut für besseren Code sorgen.
– vergänglich
15. Mai 2009 um 16:45 Uhr
Dies würde immer noch möglichen Code in der äußeren Schleife ausführen, der nach der inneren Schleife kommen würde
– Martijn
1. September 2010 um 20:04 Uhr
@Martijn – dies kann durch Ersetzen von behoben werden break mit einer continue Aussage. Trotzdem sind es nur mehr nicht offensichtliche Dinge, über die man sich Sorgen machen muss.
– Ori Pessach
25. Oktober 2011 um 17:54 Uhr
Das break Anweisung bringt Sie nur aus der innersten Schleife heraus. Wenn Sie den zusätzlichen Overhead in Code, Speicher und Leistung einer dedizierten Zustandsvariablen nicht möchten, empfehle ich, den Code in eine eigene Funktion oder Methode umzugestalten und zu verwenden return 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. */
}
}
}
Ich wäre sehr überrascht, wenn ein Funktionsaufruf in einer Schleife so gut funktionieren würde wie eine dedizierte Zustandsvariable, insbesondere wenn Sie Argumente übergeben müssen, um Zugriff auf Variablen in der äußeren Funktion zu haben. Vielleicht, wenn der Compiler die Funktion inline kopiert …
– vergänglich
14. Mai 2009 um 17:36 Uhr
Was meiner Meinung nach schlimmer ist, ist der Verlust der Fähigkeit, den Algorithmus zu verstehen, indem man ihn an einem Ort liest. All dies, um ein goto zu vermeiden?
– Ori Pessach
15. Mai 2009 um 14:35 Uhr
Ich bin auch auf dieses Break/Continue-Problem gestoßen, manchmal möchte ich die Schleife 2-3 Ebenen weiterführen. IMHO ist es am besten, die verschachtelten Schleifen in eine Methode umzugestalten, damit diese Methode zurückgeben kann, ob sie mit der übergeordneten Schleife fortfahren soll.
– Jason
2. Februar 2010 um 20:33 Uhr
Was ist, wenn der Benutzer nur die Schleife und nicht die Funktion verlassen möchte?
– Akshay J
29. Juni 2011 um 16:38 Uhr
Das ist meiner Meinung nach die beste Lösung. Es ist eindeutig, was passiert, es ist einfach zu kontrollieren, es ist einfach aufzurufen, es weist keinen unnötigen booleschen Wert zu und wertet es nicht aus, und es verwendet keine gefährlichen alten Praktiken wie goto. Leistungsbedenken sollten auch bei der Verwendung in der realen Welt nicht auffällig sein.
– Ky –
27. November 2017 um 21:24 Uhr
Lothar
Anders als die bereits erwähnte Flag-Variable oder goto könnten Sie Wurf eine Objective-C-Ausnahme:
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 dies tun sollte break. 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.
Nick Allen
Die break-Anweisung bricht nur aus der Schleife im Gültigkeitsbereich aus, die die übergeordnete Schleife ist. Wenn Sie auch aus der zweiten Schleife ausbrechen möchten, können Sie eine boolesche Variable verwenden, die sich im Bereich beider Schleifen befindet