426 Stimmen

Kann ich break verwenden, um mehrere verschachtelte 'for'-Schleifen zu beenden?

Ist es möglich, die break Funktion zum Verlassen mehrerer verschachtelter for Schleifen?

Wenn ja, wie würden Sie dabei vorgehen? Können Sie auch kontrollieren, wie viele Schleifen die break Ausgänge?

11voto

HolyBlackCat Punkte 60763

Ich bin mir nicht sicher, ob es sich lohnt, aber Sie können die benannten Schleifen von Java mit ein paar einfachen Makros emulieren:

#define LOOP_NAME(name) \
    if ([[maybe_unused]] constexpr bool _namedloop_InvalidBreakOrContinue = false) \
    { \
        [[maybe_unused]] CAT(_namedloop_break_,name): break; \
        [[maybe_unused]] CAT(_namedloop_continue_,name): continue; \
    } \
    else

#define BREAK(name) goto CAT(_namedloop_break_,name)
#define CONTINUE(name) goto CAT(_namedloop_continue_,name)

#define CAT(x,y) CAT_(x,y)
#define CAT_(x,y) x##y

Beispiel für die Verwendung:

#include <iostream>

int main()
{
    // Prints:
    // 0 0
    // 0 1
    // 0 2
    // 1 0
    // 1 1

    for (int i = 0; i < 3; i++) LOOP_NAME(foo)
    {
        for (int j = 0; j < 3; j++)
        {
            std::cout << i << ' ' << j << '\n';
            if (i == 1 && j == 1)
                BREAK(foo);
        }
    }
}

Ein weiteres Beispiel:

#include <iostream>

int main()
{
    // Prints: 
    // 0
    // 1
    // 0
    // 1
    // 0
    // 1

    int count = 3;
    do LOOP_NAME(foo)
    {
        for (int j = 0; j < 3; j++)
        {
            std::cout << ' ' << j << '\n';
            if (j == 1)
                CONTINUE(foo);
        }
    }
    while(count-- > 1);
}

7voto

Azeemali Hashmani Punkte 145

Goto kann sehr hilfreich sein, um verschachtelte Schleifen zu unterbrechen

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

5voto

JuliusAlphonso Punkte 33

Ich denke, ein goto ist unter diesen Umständen gültig:

Zur Simulation einer break / continue wollen Sie:

Pause

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

Weiter

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

3voto

Rob Punkte 2148

En break Anweisung bricht die Ausführung der nächstgelegenen umschließenden do , for , switch ou while Anweisung, in der sie erscheint. Die Kontrolle geht an die Anweisung über, die auf die abgebrochene Anweisung folgt.

von msdn .

0voto

Samarth Khanna Punkte 11
 bool found = false;

    for(int i=0; i < m; ++i){
        for(int j=0; j < n; ++j)
            if(grid[i][j] == '*'){
                q.push(make_pair(i,j));
                found = true;
                break;
            }
        if(found)
            break;
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X