2012-08-31 50 views
7

¿Qué sucede cuando se rompen los bucles anidados?break in do while loop

Supongamos el siguiente código:

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) 
      break; 
     x++; 
    } while(x != 1); 
} 

Qué bucle saldrá al encontrarse con la sentencia break, el bucle for o el do while?

+6

'break' sólo se sale del bucle interno –

+0

saldrá el do/while, si quieres salga del bucle OUTER tendrá que rodar con una instrucción goto ... – Shark

+2

Puede romper el bucle externo de varias maneras. Puede 'goto', puede' devolver', puede establecer 'x = 10;', y así onl. –

Respuesta

6

El break siempre rompe el lazo más interno.

6.8.6.3

una sentencia break termina la ejecución del interruptor más pequeño que encierra o iteración comunicado.


Si desea salir de ambos bucles, utilice una etiqueta después de la for y salta con goto.

+0

Gracias, pero goto fue exactamente lo que estaba tratando de evitar, es un poco feo, pero esa es mi opinión. aunque se parece mucho a la ejecución condicional en ensamblaje con ramas. – sgupta

+0

@ user1075375 Me gusta goto. Entiendo que es mala forma en C++ y no discutiré. Pero en C es bastante agradable :-) – cnicutar

+0

Pon una condición adicional en el bucle for que no será cierta cuando quieras salir de ella? – teppic

0

La ruptura matará el bucle más cercano/más interno que contiene la ruptura. En su ejemplo, la ruptura matará al do-while, y el control saltará nuevamente al bucle for(), y simplemente iniciará la siguiente iteración de for().

Sin embargo, como está modificando x ambos en los bucles do() Y for(), la ejecución va a ser un poco inestable. Producirá un bucle infinito una vez que la X externa alcance 5.

+0

el código se entiende por el simple hecho de hacerlo. – sgupta

0

el tiempo se romperá y el bucle for seguirá en funcionamiento.

4

Alternativamente, puede utilizar una bandera si no desea utilizar goto:

int flag = 0; 

for(int x = 0; x < 10; x++) 
{ 
    do { 
     if(x == 4) { 
      flag = 1; 
      break; 
     } 
     x++; 
    } while(x != 1); 

if(flag) 
    break; // To break the for loop 
} 
+0

teniendo en cuenta el desperdicio de 4 bytes en la memoria caché y la verificación condicional adicional en el bucle, goto parece mejores intervalos de rendimiento. Más aún porque espero que el ciclo se ejecute muchas veces. – sgupta

+1

Si buscaba el rendimiento, no estaría escribiendo este código en primer lugar. No es necesario tener el bucle for externo para nada, si se va a romper cuando alcanza un valor particular. – Floris

+0

Este no es el código que escribí, simplemente fue con fines ilustrativos para ayudar a las personas a entender lo que quise decir. – sgupta