2010-07-14 11 views
33

come posso utilizzare un'istruzione 'break' all'interno di un ciclo for che continua formare un'etichetta specificata?obiettivo C per-ciclo break e continue

ex;

outer: for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int i = 0;i<[arABFBmatches count];i++){ 
     // 
     break _____; 
    } 
} 

Come rompere verso l'esterno?

risposta

94

Difficile dire dalla tua domanda. Interpreterei che vuoi saltare il resto delle iterazioni del ciclo interno e continuare il ciclo esterno?

for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) 
      break; // let outer loop continue iterating 
    } 
} 

Nota che ho cambiato il nome del tuo ciclo interno invariante; usare i in entrambi sta invitando la pazzia.

Se si vuole rompere da entrambi i loop, non vorrei usare un goto. Lo farei:

BOOL allDoneNow = NO; 
for (int i = 0; i < [arABFBmatches count]; i++) { 
    for (int j = 0; j < [arABFBmatches count]; j++) { 
     if (should_skip_rest) { 
      allDoneNow = YES; 
      break; 
     } 
    } 
    if (allDoneNow) break; 
} 
+32

+1 per invitare la pazzia. – uchuugaka

+9

E per favore, per motivi di leggibilità, non dimentichiamo di mettere gli spazi intorno ai nostri operatori. Non "for (int i = 0; i <[arABFBmatches count]; i ++)".Invece: "for (int i = 0; i <[arABFBmatches count]; i ++)" –

+0

Lei signore è genio. – GeneCode

9

Approssimativamente:

for(int i = 0;i<[arABFBmatches count];i++){ 
    for(int j = 0;j<[arABFBmatches count];j++){ 
     // 
     goto outer_done; 
    } 
} 
outer_done: 

Objective-C non ha etichetta pausa.

+1

Se si utilizza 'goto', sii molto molto attento a gestire correttamente la gestione della memoria. –

+0

'goto' è meglio che impostare un flag e testare il flag per dire se uscire dal ciclo esterno. certo dobbiamo stare attenti. – neevek

+4

Non necessariamente per niente meglio; se il loop interno è circondato da una logica di setup/teardown, il 'goto' può saltare felicemente sopra il teardown. Se è necessario aggiungere questo tipo di logica in un secondo momento, è facile dimenticare il caso di cortocircuito durante il refactoring. C'è una forte argomentazione da fare per il controllo del flusso che è senza pretese. – bbum

1

'break' ti farà uscire dal ciclo più interno o dall'interruttore. Puoi usare 'return' per uscire da una funzione in qualsiasi momento. Per favore dai un'occhiata al link this.

+0

La maggior parte delle regole di progettazione commerciale richiede solo un (1) 'ritorno' da una funzione. – Vincent

1
BOOL done = NO; 
for(int i = 0;i<[arABFBmatches count] && !done; i++) 
{ 
    for(int i = 0;i<[arABFBmatches count] && !done;i++) 
    { 
     if (termination condition) 
     { 
      // cleanup 
      done = YES; 
     } 
    } 
} 
+1

Puoi aggiungere una spiegazione? – Robert

2

Dalla documentazione di Apple Objective-C:

Objective-C è definito come un piccolo ma potente set di estensioni per il linguaggio standard ANSI C.

Così break e continue può essere utilizzato ovunque essi sono ammessi in C.

continuano può essere utilizzato in costrutti di loop (for, while e do/while).

pausa può essere utilizzato in quegli stessi costrutti di loop nonché in istruzioni switch.

2

giù voto ...... Se si utilizza goto semplifica il codice, quindi sarebbe opportuno.

for (;;) 
{ 
    for (;;) 
    { 

     break; /* breaks inner loop */ 

    } 

    for (;;) 
    { 

     goto outer; /* breaks outer loop */ 
    } 

} 
outer:; 
+1

Questa risposta sembra essere plagiata da [questo post] (http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c/863.392 # 863.392). – Pang

+0

No, scusa, questa risposta è mia. –