2010-07-14 12 views
33

¿Cómo puedo usar una declaración 'break' dentro de un for-loop que continúa desde una etiqueta especificada?objetivo C for-loop break and continue

ex;

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

Cómo romper al exterior?

Respuesta

94

Es difícil decirlo de su pregunta. ¿Lo interpretaría que quiere omitir el resto de las iteraciones del bucle interno y continuar el bucle externo?

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 
    } 
} 

Tenga en cuenta que he cambiado el nombre de su invariante de lazo interno; usar i en ambos está invitando a la locura.

Si quiere romper con ambos bucles, no usaría un goto. Haría:

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 por invitar a la locura. – uchuugaka

+9

Y, por razones de legibilidad, no nos olvidemos de poner espacios alrededor de nuestros operadores. No "for (int i = 0; i <[arABFBmatches count]; i ++)".En cambio: "for (int i = 0; i <[arABFBmatches count]; i ++)" –

+0

Usted señor es genio. – GeneCode

9

Aproximadamente:

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

de Objective-C no tiene etiqueta descanso.

+1

Si va a utilizar 'goto', tenga mucho cuidado de manejar la gestión de memoria correctamente. –

+0

'goto' es mejor que establecer una bandera y probar la bandera para saber si debe salir del bucle externo. Seguro que debemos tener cuidado. – neevek

+4

No necesariamente mejor en absoluto; si el bucle interno está rodeado por alguna lógica de configuración/derribo, el 'goto' puede saltar alegremente sobre el desmontaje. Si tiene que agregar este tipo de lógica más adelante, es fácil olvidar la carcasa del cortocircuito al refactorizar. Hay un argumento fuerte que se debe hacer para controlar el flujo que no tiene salto. – bbum

1

'break' solo lo sacará del bucle o interruptor más interno. Puede usar 'return' para salir de una función en cualquier momento. Consulte el enlace this.

+0

La mayoría de las reglas de diseño comercial exigen solo un (1) 'retorno' de una función. – 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

¿Puedes agregar una explicación? – Robert

2

a partir de documentos de Objective-C de Apple:

Objective-C se define como un pequeño pero potente conjunto de extensiones para el lenguaje estándar ANSI C.

Así romper y seguir puede ser utilizado dondequiera que se permiten en C.

siguen se pueden utilizar en construcciones en bucle (for, while y do/while).

break se puede utilizar en esas mismas construcciones de bucle, así como en instrucciones de cambio.

2

abajo vote ...... Si usar goto simplifica el código, entonces sería apropiado.

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

     break; /* breaks inner loop */ 

    } 

    for (;;) 
    { 

     goto outer; /* breaks outer loop */ 
    } 

} 
outer:; 
+1

Esta respuesta parece estar plagiada de [esta publicación] (http://stackoverflow.com/questions/863172/how-can-i-break-out-of-two-nested-for-loops-in-objective-c/863392 # 863392). – Pang

+0

No, lo siento, esta es la respuesta mía. –