Wie kann ich in Objective-C aus zwei verschachtelten for-Schleifen ausbrechen?

Lesezeit: 4 Minuten

Danke Benutzer-Avatar
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.

Benutzeravatar von Ori Pessach
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

Benutzeravatar von jbasko
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 goto tut 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

lothars Benutzeravatar
Lothar

Anders als die bereits erwähnte Flag-Variable oder goto könnten Sie Wurf eine Objective-C-Ausnahme:

@try {
  for() {
    for() {
       @throw ...
    }
  }
}
@catch{
  ...
}

Benutzeravatar von George Armhold
Georg Armhold

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.

Benutzeravatar von Nick Allen
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

bool isTerminated = false;

for (...)
{
    if (!isTerminated)
    {
        for(...)
        {
            ...

            isTerminated = true;
            break;
        }
    }
    else
    {
        break;
    }
}

Benutzeravatar von oxigen
Sauerstoff

Ä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;
  }

  • Ich mag das nicht so sehr. Das Risiko besteht darin, dass jemand die Ausgangsbedingung an einer Stelle ändert und die andere vergisst.

    – Johann Kotlinski

    14. Mai 2009 um 13:18 Uhr

  • NSUInteger limit = 10; Dann: for(i=0; i<limit; i++) { for(j=0; j<10; j++) { .. .. i = limit; break; } }

    – Matt Mc

    15. Oktober 2012 um 20:02 Uhr

1417480cookie-checkWie kann ich in Objective-C aus zwei verschachtelten for-Schleifen ausbrechen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy