2011-02-14 18 views
7

¿Existe la posibilidad de que un continue o break tenga un alcance mayor que el bucle que se está ejecutando actualmente?
En el siguiente ejemplo, deseo continuar en el bucle for externo cuando expr es verdadero, aunque se invoca en el bucle for interno, de modo que no se ejecuta ni [some inner code] ni [some outer code].continuar y romper con un alcance extendido

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
    for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
     [continue outer]; // here I wish to continue on the outer loop  
     } 
     [some inner code] 
    } 
    [some outer code] 
} 

En lo anterior

Respuesta

11

Puede usar goto si es absolutamente necesario. Sin embargo, normalmente tomo uno de los dos enfoques:

  • hacer que el bucle interior un método separado regresar bool, así que sólo puedo volver de ella e indicar lo que el bucle externo debería hacer (descanso, continuar, o hacer el resto del cuerpo del bucle)
  • Mantener una bandera independiente bool que se establece antes de que el bucle interior, pueden ser modificados dentro el bucle interior, y luego se comprueba después de el bucle interior

de estos enfoques YO generalmente prefieren el enfoque de "extraer método".

+1

Es sorprendente cómo las habilidades de comunicación pueden hacer la diferencia a veces. Realmente prefiero tu respuesta a la mía. – tzup

1

Puede utilizar instrucción goto, de lo contrario - no, romper y continuar declaraciones no admite esta.

Aunque se considera instrucción goto como mala práctica esta es la única razón por la que salir más de una de bucles ... Y parece que esta es la razón de ser todavía una parte de .NET

4

Qué quiere decir ¿algo como esto?

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
    for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
     runOuter = true; 
     break; 
     } 
     [some inner code] 
    } 
    if (!runOuter) { 
     [some outer code] 
    } 
    runOuter = false; 
} 
+1

Será no desde que runOuter será verdadera y [algo de código externo] sólo se ejecuta si runOuter es falsa. ¿No es esta la lógica que querías? – tzup

+0

+1 Sí, gracias, esta es la segunda versión de la publicación de Jon Skeets. Sin embargo, mi comentario anterior estaba relacionado con tu primera respuesta, que no resolvió el problema. Borré mi comentario – HCL

+0

@HCL, me acabo de dar cuenta de eso. Es raro que pudieras ver esa publicación ya que traté de eliminarla rápidamente cuando me di cuenta de mi error y la publicación de una respuesta mejor. De todos modos, Jon merece por completo esta respuesta. – tzup

1

Puede utilizar goto comunicado con etiquetas:

for(int outerCounter=0;outerCounter<20;outerCounter++){ 
     for(int innerCounter=0;innerCounter<20;innerCounter++){ 
     if(expr){ 
      break; 
     } 
     [some inner code] 
     } 
     // You will come here after break 
     [some outer code] 
    } 
+1

esto se puede hacer con declaración de interrupción simple – anthares