Ist es möglich, mit dieser break
Funktion mehrere verschachtelte for
Schleifen zu verlassen?
Wenn ja, wie würden Sie dies tun? Können Sie auch steuern, wie viele Schleifen die break
Ausgänge haben?
c++
for-loop
break
nested-loops
Gefälscht
quelle
quelle
Antworten:
AFAIK, C ++ unterstützt keine Namensschleifen 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.
quelle
goto
wenn dies die beste Option ist.goto
: schlechte Programmierer und pragmatische Programmierer. Ersteres ist selbsterklärend. Letztere, in die Sie passen würden, wenn Sie sie gut verwenden möchten, verwenden ein sogenanntes "böses" Konzept, wenn es das geringere von (zwei) Übeln ist. Lesen Sie dies, um einige C ++ - Konzepte besser zu verstehen, die Sie möglicherweise von Zeit zu Zeit verwenden müssen (Makros, Goto, Präprozessor, Arrays): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
selten die beste Option ist. Warum nicht die Loops in ihre eigene Funktion versetzen (inline
wenn Sie sich Gedanken über die Geschwindigkeit machen) undreturn
daraus?Nein, verwöhne es nicht mit einem
break
. Dies ist die letzte verbleibende Festung für die Nutzung vongoto
.quelle
Nur um eine explizite Antwort mit Lambdas hinzuzufügen:
Natürlich hat dieses Muster einige Einschränkungen und natürlich nur C ++ 11, aber ich denke, es ist ziemlich nützlich.
quelle
Ein anderer Ansatz zum Ausbrechen einer verschachtelten Schleife besteht darin, beide Schleifen in eine separate Funktion und
return
aus dieser Funktion heraus zu zerlegen, wenn Sie sie beenden möchten.Dies wirft natürlich das andere Argument auf, ob Sie jemals explizit
return
von einer anderen Funktion als am Ende ausgehen sollten.quelle
continue_processing
) übersät waren , die die Ausführung von Codeblöcken weiter unten in der Funktion kontrollierten.break beendet nur die innerste Schleife, die es enthält.
Sie können goto verwenden , um aus einer beliebigen Anzahl von Schleifen auszubrechen.
Natürlich wird goto oft als schädlich angesehen .
Die Verwendung von break und goto kann es schwieriger machen, über die Richtigkeit eines Programms nachzudenken. Hier finden Sie eine Diskussion dazu: Dijkstra war nicht verrückt .
quelle
break
oder zu empfehlenreturn
.break
undreturn
haben den Vorteil,goto
dass Sie nicht nach einem Label suchen müssen, um herauszufinden, wohin sie gehen. Ja, darunter sind sie eine Artgoto
, aber eine sehr eingeschränkte. Sie sind vom Mustervergleichsgehirn eines Programmierers viel einfacher zu entziffern als das uneingeschränktegoto
. Also IMO sind sie vorzuziehen.goto
.Obwohl diese Antwort bereits vorgestellt wurde, denke ich, dass ein guter Ansatz darin besteht, Folgendes zu tun:
quelle
gotoMainLoop
in jedem Zyklus überprüft wirdgoto
macht die Verwendung des Real den Kern lesbarer und leistungsfähiger.Wie wäre es damit?
quelle
Ein Codebeispiel mit
goto
und eine Bezeichnung zum Ausbrechen einer verschachtelten Schleife:quelle
Eine gute Möglichkeit, aus mehreren verschachtelten Schleifen auszubrechen, besteht darin, Ihren Code in eine Funktion umzuwandeln:
quelle
goto kann sehr hilfreich sein, um verschachtelte Schleifen zu brechen
quelle
von msdn .
quelle
Ich denke, a
goto
ist unter diesen Umständen gültig:Um ein
break
/ zu simulierencontinue
, möchten Sie:Brechen
Fortsetzen
quelle
i
. Daheri++
vor dem gotoAndere Sprachen wie PHP akzeptieren einen Parameter für break (dh break 2;), um die Anzahl der verschachtelten Schleifenebenen anzugeben, aus denen Sie ausbrechen möchten, C ++ jedoch nicht. Sie müssen es herausfinden, indem Sie einen Booleschen Wert verwenden, den Sie vor der Schleife auf false gesetzt haben, der in der Schleife auf true gesetzt ist, wenn Sie brechen möchten, sowie eine bedingte Unterbrechung nach der verschachtelten Schleife, um zu überprüfen, ob der Boolesche Wert auf true gesetzt wurde und brechen wenn ja.
quelle
Ich weiß, das ist ein alter Beitrag. Aber ich würde eine etwas logische und einfachere Antwort vorschlagen.
quelle
j = conditionj
sie nicht funktioniert, wenn Sie stattdessen ein komplexes Prädikat habenj < conditionj
.Brechen Sie eine beliebige Anzahl von Schleifen mit nur einer
bool
Variablen (siehe unten):In diesem Code haben wir
break;
alle Schleifen.quelle
Ich bin mir nicht sicher, ob es sich lohnt, aber Sie können Javas benannte Schleifen mit ein paar einfachen Makros emulieren:
Anwendungsbeispiel:
Ein anderes Beispiel:
quelle
quelle
Sie können try ... catch verwenden.
Wenn Sie aus mehreren Schleifen gleichzeitig ausbrechen müssen, ist dies oft eine Ausnahme.
quelle
Das Ausbrechen einer for-Schleife ist für mich etwas seltsam, da die Semantik einer for-Schleife normalerweise anzeigt, dass sie eine bestimmte Anzahl von Malen ausgeführt wird. Es ist jedoch nicht in allen Fällen schlecht; Wenn Sie nach etwas in einer Sammlung suchen und es brechen möchten, nachdem Sie es gefunden haben, ist es nützlich. Das Aufbrechen verschachtelter Schleifen ist in C ++ jedoch nicht möglich. Es ist in anderen Sprachen durch die Verwendung einer beschrifteten Pause. Sie können ein Etikett und ein Goto verwenden, aber das kann nachts zu Sodbrennen führen. Scheint jedoch die beste Option zu sein.
quelle