while sentencia salir for etiquetas con ciclo anidados anidado c++ for-loop break nested-loops

c++ - salir - sentencia break en java



¿Puedo usar break para salir de varios bucles anidados para? (17)

¿Es posible usar la función break para salir de varios bucles anidados? Si es así, ¿cómo harías esto? ¿También puedes controlar cuántos bucles sale el break?


La instrucción break termina la ejecución de la instrucción do , for , switch o while más cercana que aparece. El control pasa a la sentencia que sigue a la sentencia terminada.

desde msdn .


¿Qué tal esto?

for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { //Some statement if (condition) { j=50; k=50; } } } }


AFAIK, C ++ no admite lazos de nombres, como Java y otros lenguajes. Puedes usar un goto o crear un valor de bandera que uses. Al final de cada bucle, compruebe el valor del indicador. Si se establece en verdadero, entonces puedes salir de esa iteración.


Aunque esta respuesta ya se presentó, creo que un buen enfoque es hacer lo siguiente:

for(unsigned int z = 0; z < z_max; z++) { bool gotoMainLoop = false; for(unsigned int y = 0; y < y_max && !gotoMainLoop; y++) { for(unsigned int x = 0; x < x_max && !gotoMainLoop; x++) { //do your stuff if(condition) gotoMainLoop = true; } } }


Creo que un goto es válido en esta circunstancia:

Para simular un break / continue , querrías:

Descanso

for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { goto theEnd; } } } theEnd:

Continuar

for ( ; ; ) { for ( ; ; ) { /*Code here*/ if (condition) { i++; goto multiCont; } } multiCont: }


No, no lo estropee con un break . Este es el último bastión restante para el uso de goto .


Otro enfoque para salir de un bucle anidado es dividir ambos bucles en una función separada y return de esa función cuando quiera salir.

Por supuesto, esto trae a colación el otro argumento de si alguna vez deberías return explícitamente desde una función a otra parte que no sea el final.


Otros idiomas, como PHP, aceptan un parámetro para break (es decir, break 2;) para especificar la cantidad de niveles de bucle anidados que desea romper, sin embargo, C ++ no lo hace. Tendrá que resolverlo utilizando un valor booleano que haya establecido en falso antes del bucle, establecerlo en verdadero en el bucle si desea interrumpir, más un corte condicional después del bucle anidado, verificando si el valor booleano se configuró en verdadero y romper si es así.


Puedes usar try ... catch.

try { for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { if(i*j == 42) throw 0; // this is something like "break 2" } } } catch(int e) {} // just do nothing // just continue with other code

Si tiene que salir de varios bucles a la vez, a menudo es una excepción.


Sé que este es el viejo post. Pero sugeriría una respuesta un poco lógica y más simple.

for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < conditionj; j++) { for(unsigned int k=0; k< conditionk ; k++) { // If condition is true j= conditionj; break; } } }


Salir de un bucle for es un poco extraño para mí, ya que la semántica de un bucle for generalmente indica que se ejecutará un número específico de veces. Sin embargo, no es malo en todos los casos; Si está buscando algo en una colección y quiere romper después de encontrarlo, es útil. Sin embargo, no es posible romper los bucles anidados en C ++; Está en otros idiomas a través del uso de una rotura etiquetada. Puede usar una etiqueta y un goto, pero eso podría provocarle acidez estomacal por la noche. Aunque parece la mejor opción.


Solo para agregar una respuesta explícita usando lambdas:

for (int i = 0; i < n1; ++i) { [&] { for (int j = 0; j < n2; ++j) { for (int k = 0; k < n3; ++k) { return; // yay we''re breaking out of 2 loops here } } }(); }

Por supuesto, este patrón tiene ciertas limitaciones y, obviamente, solo C ++ 11, pero creo que es bastante útil.


Un ejemplo de código que usa goto y una etiqueta para salir de un bucle anidado:

for (;;) for (;;) goto theEnd; theEnd:


Una buena manera de romper con varios bucles anidados es refactorizar su código en una función:

void foo() { for(unsigned int i=0; i < 50; i++) { for(unsigned int j=0; j < 50; j++) { for(unsigned int k=0; k < 50; k++) { // If condition is true return; } } } }


goto puede ser muy útil para romper bucles anidados

for (i = 0; i < 1000; i++) { for (j = 0; j < 1000; j++) { for (k = 0; k < 1000; k++) { for (l = 0; l < 1000; l++){ .... if (condition) goto break_me_here; .... } } } } break_me_here: // Statements to be executed after code breaks at if condition


break solo saldrá del bucle más interno que lo contiene.

Puedes usar goto para romper cualquier cantidad de bucles.

Por supuesto goto a menudo se considera dañino .

¿es apropiado usar la función de ruptura [...]?

Usar break y goto puede hacer que sea más difícil razonar acerca de la corrección de un programa. Vea aquí para una discusión sobre esto: Dijkstra no estaba loco .


while (i<n) { bool shouldBreakOuter = false; for (int j=i + 1; j<n; ++j) { if (someCondition) { shouldBreakOuter = true; } } if (shouldBreakOuter == true) break; }