Kann ich mit “break” mehrere verschachtelte For-Schleifen beenden?

Ist es möglich, die break function zu verwenden, um mehrere verschachtelte for Schleifen for beenden? Wenn ja, wie würdest du das machen? Kannst du auch steuern, wie viele Schleifen die Pause beendet?

   

    AFAIK, C ++ unterstützt keine Benennungsschleifen wie Java und andere Sprachen. Sie können ein Goto verwenden oder einen von Ihnen verwendeten Flag-Wert erstellen. Überprüfen Sie am Ende jeder Schleife den Flag-Wert. Wenn es auf “True” gesetzt ist, können Sie aus dieser Iteration ausbrechen.

    Nein, verderbe es nicht mit einer break . Dies ist die letzte Hochburg für den Einsatz von goto .

    Ein anderer Ansatz zum Ausbrechen einer verschachtelten Schleife besteht darin, beide Schleifen in eine separate function zu zerlegen und von dieser function zurückzukommen, wenn Sie den Vorgang beenden möchten.

    Dies führt natürlich zu dem anderen Argument, ob Sie jemals ausdrücklich von einer function anders als am Ende zurückkehren sollten.

    Nur um eine explizite Antwort mit lambdas hinzuzufügen:

      for (int i = 0; i < n1; ++i) { [&] { for (int j = 0; j < n2; ++j) { for (int k = 0; k < n3; ++k) { return; // yay we're breaking out of 2 loops here } } }(); } 

    Natürlich hat dieses Muster gewisse Einschränkungen und offensichtlich nur C ++ 11, aber ich denke es ist sehr nützlich.

    break beendet nur die innerste Schleife, die es enthält.

    Sie können mit goto aus einer beliebigen Anzahl von Schleifen ausbrechen.

    Natürlich wird goto oft als schädlich angesehen .

    ist es richtig, die Pausenfunktion zu benutzen […]?

    Die Verwendung von break und goto kann die Korrektheit eines Programms erschweren. Sehen Sie hier für eine Diskussion darüber: Dijkstra war nicht verrückt .

    Obwohl diese Answers bereits vorgestellt wurde, denke ich, ist ein guter Ansatz das Folgende zu tun:

     for(unsigned int z = 0; z < z_max; z++) { bool gotoMainLoop = false; for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++) { for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++) { //do your stuff if(condition) gotoMainLoop = true; } } } 

    Wie wäre es damit?

     for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { //Some statement if (condition) { j=50; k=50; } } } } 

    Eine gute Möglichkeit, aus mehreren verschachtelten Schleifen auszubrechen, besteht darin, den Code in eine function umzuwandeln:

     void foo() { for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { // If condition is true return; } } } } 

    Ein Codebeispiel mit goto und einem Label zum Ausbrechen aus einer verschachtelten Schleife:

     for (;;) for (;;) goto theEnd; theEnd: 

    goto kann sehr hilfreich sein, um verschachtelte Schleifen zu brechen

     for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 1000; k++) { for (l = 0; l < 1000; l++){ .... if (condition) goto break_me_here; .... } } } } break_me_here: // Statements to be executed after code breaks at if condition 

    Die break statement beendet die Ausführung der nächsten umschließenden statement do , for , switch oder while , in der sie angezeigt wird. Die Steuerung wird an die statement übergeben, die auf die beendete statement folgt.

    von msdn .

    Ich denke, dass ein goto in diesem Fall gültig ist:

    Um eine break zu simulieren / continue , möchtest du:

    Unterbrechung

     for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { goto theEnd; } } } theEnd: 

    Fortsetzen

     for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { i++; goto multiCont; } } multiCont: } 

    Andere Sprachen wie PHP akzeptieren einen Parameter für break (dh break 2;), um die Anzahl der geschachtelten Schleifenebenen anzugeben, aus denen Sie ausbrechen möchten, C ++ jedoch nicht. Sie müssen es ausarbeiten, indem Sie einen booleschen Wert verwenden, den Sie vor der Schleife auf “false” setzen, in der Schleife auf “true” setzen, wenn Sie brechen wollen, plus eine bedingte Unterbrechung nach der verschachtelten Schleife und prüfen, ob der boolesche Wert auf “true” gesetzt wurde und breche wenn ja.

    Ich weiß, das ist ein alter Post. Aber ich würde eine logische und einfachere Antwort vorschlagen.

     for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < conditionj; j++) { for(unsigned int k=0; k< conditionk ; k++) { // If condition is true j= conditionj; break; } } } 

    Sie können versuchen … fangen.

     try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if(i*j == 42) throw 0; // this is something like "break 2" } } } catch(int e) {} // just do nothing // just continue with other code 

    Wenn Sie aus mehreren Loops gleichzeitig ausbrechen müssen, ist das oft eine Ausnahme.

      while (i 

    Das Ausbrechen einer for-Schleife ist etwas seltsam für mich, da die Semantik einer for-Schleife typischerweise anzeigt, dass sie eine spezifizierte Anzahl von Malen ausführen wird. Es ist jedoch nicht in allen Fällen schlecht; Wenn Sie nach etwas in einer Sammlung suchen und nach dem Auffinden etwas kaputt machen möchten, ist es nützlich. Das Aufbrechen verschachtelter Schleifen ist jedoch in C ++ nicht möglich. Es ist in anderen Sprachen durch die Verwendung einer markierten Pause. Sie können ein Etikett und ein Goto verwenden, aber das könnte Sodbrennen in der Nacht verursachen ..? Scheint aber die beste Option.