Si utilizo una break
declaración, solo romperá el bucle interno y necesito usar alguna bandera para romper el bucle externo. Pero si hay muchos bucles anidados, el código no se verá bien.
¿Hay alguna otra forma de romper todos los bucles? (No lo use goto stmt
).
for(int i = 0; i < 1000; i++) {
for(int j = 0; j < 1000; j++) {
if(condition) {
// both of the loops need to break and control will go to stmt2
}
}
}
stmt2
c
nested-loops
break
usuario966379
fuente
fuente
Respuestas:
Utilizar:
fuente
const int count =1000
, en la inicialización global. o como una#define
macro.No, no estropees la diversión con un
break
. Este es el último uso válido restante degoto
;)Si no es así, puede usar banderas para salir de bucles anidados profundos.
Otro enfoque para salir de un bucle anidado es factorizar ambos bucles en una función separada y volver de esa función cuando desee salir.
Resumido: para salir de bucles anidados:
goto
No pude resistirme a incluir xkcd aquí :)
fuente
Los Goto se consideran dañinos, pero como sugieren muchas personas en los comentarios, no es necesario. Si se usa con prudencia, puede ser una gran herramienta. Cualquier cosa que se use con moderación es divertida.
fuente
fuente
Una forma es poner todos los bucles anidados en una función y regresar desde el bucle más interno en caso de que sea necesario salir de todos los bucles.
fuente
Creo
goto
que solucionará el problemafuente
Necesitará una variable booleana, si quiere que sea legible:
Si lo desea menos legible, puede unirse a la evaluación booleana:
Como forma definitiva, puede invalidar el bucle inicial:
fuente
Utilice este sabio consejo del equipo de LLVM:
"Convierta los bucles de predicados en funciones de predicados"
Ver:
http://llvm.org/docs/CodingStandards.html#turn-predicate-loops-into-predicate-functions
fuente
Precaución: esta respuesta muestra una construcción verdaderamente oscura.
Si está utilizando GCC, consulte esta biblioteca . Como en PHP,
break
puede aceptar el número de bucles anidados que desea salir. Puedes escribir algo como esto:fuente
goto
:)goto
) es mucho más preferible que el ensamblaje en línea (específico de la máquina, más fácil de cometer un error, más difícil de leer, ...).fuente
Si necesita los valores de i y j, esto debería funcionar pero con menos rendimiento que otros
fuente
j
entonces el valor de la condición debe almacenarse de alguna manera para que esto siga funcionando.for (int i = 0; i < 1000; i++) { for (int j = 0; j < 1000; j++) { if (workComplete[i][j]) break; /* do work */ workComplete[i][j] = true; } if (workComplete[i][j]) break; ... }
va a siempre salir del bucle exterior después de la primera iteración del bucle interno.Romperá ambos bucles.
fuente
fuente
condition
vuelve falso. Ah, y el segundo bucle se ejecutará para siempre porque se incrementa eni
lugar dej
, ¡uy ...fuente