¿Es posible usar la break
función para salir de varios for
bucles anidados ?
Si es así, ¿cómo harías para hacer esto? ¿Puedes controlar también cuántos bucles break
salen?
c++
for-loop
break
nested-loops
Falso
fuente
fuente
Respuestas:
AFAIK, C ++ no admite bucles de nombres, como lo hacen Java y otros lenguajes. Puede usar un goto o crear un valor de marca que use. Al final de cada ciclo, verifique el valor del indicador. Si se establece en verdadero, puede salir de esa iteración.
fuente
goto
si esa es la mejor opción.goto
: programadores malos y programadores pragmáticos. Los primeros se explican por sí mismos. Este último, en el que encajaría si elige usarlos bien, utiliza un concepto llamado "malvado" cuando es el menor de (dos) males. Lea esto para comprender mejor algunos conceptos de C ++ que puede necesitar usar de vez en cuando (macros, goto's, preprocesador, matrices): parashift.com/c++-faq-lite/big-picture.html#faq-6.15goto
raramente es la mejor opción. ¿Por qué no poner los bucles en su propia función (inline
si te preocupa la velocidad) yreturn
de esto?No, no lo estropees con un
break
. Este es el último bastión restante para el uso degoto
.fuente
Solo para agregar una respuesta explícita usando lambdas:
Por supuesto, este patrón tiene ciertas limitaciones y obviamente solo C ++ 11, pero creo que es bastante útil.
fuente
Otro enfoque para salir de un bucle anidado es factorizar ambos bucles en una función separada, y
return
desde esa función cuando desee salir.Por supuesto, esto trae a colación el otro argumento de si alguna vez debería explícitamente
return
desde una función en cualquier lugar que no sea al final.fuente
continue_processing
) que controlaban la ejecución de bloques de código más abajo en la función.break saldrá solo del bucle más interno que lo contiene.
Puede usar goto para salir de cualquier número de bucles.
Por supuesto, ir a menudo se considera perjudicial .
Usar break y goto puede hacer que sea más difícil razonar sobre la corrección de un programa. Vea aquí para una discusión sobre esto: Dijkstra no estaba loco .
fuente
break
oreturn
.break
yreturn
tiene la ventaja degoto
que no necesita buscar una etiqueta para saber a dónde van. Sí, debajo hay algún tipo degoto
, pero muy restringido. Son mucho más fáciles de descifrar por el cerebro de coincidencia de patrones de un programador que los no restringidosgoto
. Por lo tanto, son preferibles.goto
.Aunque esta respuesta ya se presentó, creo que un buen enfoque es hacer lo siguiente:
fuente
gotoMainLoop
se verifica cada ciclogoto
hace que el núcleo sea más legible y tenga un mejor rendimiento.¿Qué tal esto?
fuente
Un ejemplo de código con
goto
una etiqueta para salir de un bucle anidado:fuente
Una buena manera de salir de varios bucles anidados es refactorizar su código en una función:
fuente
Goto puede ser muy útil para romper bucles anidados
fuente
de msdn .
fuente
Creo que un
goto
es válido en esta circunstancia:Para simular un
break
/continue
, querrías:Rotura
Seguir
fuente
i
. Por lo tanto,i++
antes del gotoOtros lenguajes, como PHP, aceptan un parámetro para la interrupción (es decir, la interrupción 2;) para especificar la cantidad de niveles de bucle anidados de los que desea salir, pero C ++ no lo hace. Tendrá que resolverlo usando un booleano que establezca en falso antes del ciclo, establezca en verdadero en el ciclo si desea romper, más un corte condicional después del ciclo anidado, verificando si el booleano se estableció en verdadero y romper si es así.
fuente
Sé que esta es una publicación antigua. Pero sugeriría una respuesta un poco lógica y más simple.
fuente
j = conditionj
que no funcionará si tiene un predicado complejo en lugar dej < conditionj
.Divida cualquier número de bucles por una sola
bool
variable, vea a continuación:En este código tenemos
break;
todos los bucles.fuente
No estoy seguro de si vale la pena, pero puede emular los bucles con nombre de Java con algunas macros simples:
Ejemplo de uso:
Otro ejemplo:
fuente
fuente
Puedes usar try ... catch.
Si tiene que salir de varios bucles a la vez, a menudo es una excepción.
fuente
Romper 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 romperlo después de encontrarlo, es útil. Sin embargo, la ruptura de bucles anidados no es posible en C ++; es en otros idiomas mediante el uso de un descanso etiquetado. Puede usar una etiqueta y un goto, pero eso podría provocarle acidez estomacal por la noche ... Sin embargo, parece la mejor opción.
fuente