Ich habe zwei so geschachtelte Schleifen:
for(...) {
for(...) {
}
}
Ich weiß, dass es eine break
-Anweisung gibt. Aber ich bin verwirrt darüber, ob es beide Schleifen bricht oder nur die, in der es heißt? Ich muss beide brechen, sobald ich sehe, dass es keinen Sinn macht, mehrmals zu iterieren.
break bricht aus einer Schleife heraus, Sie können jedoch die äußere Schleife mit einem Häkchen versehen, die bei einem inneren Bruch bricht.
bool dobreak = false;
for ( ..; !dobreak && ..; .. ) {
for ( ... ) {
if (...) {
dobreak = true;
break;
}
}
}
Wenn Sie mit goto den Code vereinfachen, ist es angebracht.
for (;;)
{
for (;;)
{
break; /* breaks inner loop */
}
for (;;)
{
goto outer; /* breaks outer loop */
}
}
outer:;
Die break
-Anweisung bringt Sie nur aus der innersten Schleife heraus. Wenn Sie keinen zusätzlichen Aufwand für Code, Speicher und Leistung einer dedizierten Statusvariablen haben möchten, empfehle ich, den Code in eine eigene Funktion oder Methode umzuwandeln und return
zu verwenden, um alle Schleifen zu verlassen:
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. */
}
}
}
Abgesehen von der bereits erwähnten Flagvariablen oder dem angegebenen goto können Sie throw eine Objective-C-Ausnahme annehmen:
@try {
for() {
for() {
@throw ...
}
}
}
@catch{
...
}
Andere haben erwähnt, wie Sie ein Flag setzen oder eine goto
verwenden können, aber ich würde empfehlen, Ihren Code so umzubauen, 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 break
sein sollte. 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 haben die Idee.
Ä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;
}
Eine andere Lösung besteht darin, die zweite Schleife in einer Funktion herauszufiltern:
int i;
for(i=0; i<10 ; i++){
if !innerLoop(i) {
break;
}
}
bool innerLoop(int i)
int j;
for(j=0;j< 10; j++){
doSomthing(i,j);
if(endcondtion){
return false;
}
}
}
Die break-Anweisung bricht nur den Geltungsbereich der Schleife aus, der die übergeordnete Schleife ist. Wenn Sie auch aus der zweiten Schleife ausbrechen möchten, können Sie eine boolesche Variable verwenden, die sich in beiden Schleifen befindet
bool isTerminated = false;
for (...)
{
if (!isTerminated)
{
for(...)
{
...
isTerminated = true;
break;
}
}
else
{
break;
}
}
Am einfachsten ist es wahrscheinlich, eine "Flag" -Variable zu verwenden
for(i=0; i<10 && (done==false); i++)
for(j=0;j< 10; j++){
..
..
if(...){done=true; break;}
}
Die break-Anweisung bricht aus der innersten Schleife aus. Eine zusätzliche Test- und Break-Anweisung wäre erforderlich, um die äußere Schleife zu verlassen.
Wenn eine Unterbrechung innerhalb einer Gruppe verschachtelter Schleifen ausgeführt wird, wird nur die innerste Schleife beendet, in der die Unterbrechung ausgeführt wird. (Wie bei Standard C)
Nur für Grins, wie würden Sie diese wahr/falsch-Prüfung in eine Methode ändern und return
-Anweisungen verwenden:
- (bool) checkTrueFalse: parameters{
for ( ...) {
for ( ... ) {
if (...) {
return true;
}
}
}
return false;
}
Genau wie die letzten sind im Allgemeinen so:
for(i=0;i<a;i++){
for(j=0;j<a;j++){
if(Something_goes_wrong){
i=a;
break;
}
}
}