while uso salir infinito for ejemplo ciclo bucle for-loop break

for loop - uso - ¿Es una mala práctica usar break en un ciclo for?



uso de for en js (19)

¡Estoy en desacuerdo!

¿Por qué ignorarías la funcionalidad incorporada de un bucle for para hacer tu propio? No necesitas reinventar la rueda.

Creo que tiene más sentido tener tus cheques en la parte superior de tu bucle for, así

for(int i = 0; i < myCollection.Length && myCollection[i].SomeValue != "Break Condition"; i++) { //loop body }

o si necesita procesar la fila primero

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++) { //loop body }

De esta forma puedes escribir una función para realizar todo y crear un código mucho más limpio.

for(int i = 0; i < myCollection.Length && (i == 0 ? true : myCollection[i-1].SomeValue != "Break Condition"); i++) { DoAllThatCrazyStuff(myCollection[i]); }

¡O si tu condición es complicada, puedes mover ese código también!

for(int i = 0; i < myCollection.Length && BreakFunctionCheck(i, myCollection); i++) { DoAllThatCrazyStuff(myCollection[i]); }

El "código profesional" que está plagado de interrupciones en realidad no me parece código profesional. Suena como una codificación floja;)

¿Es una mala práctica usar la instrucción break dentro de un ciclo for ?

Diga, estoy buscando un valor en una matriz. Comparar dentro de un ciclo for y cuando se encuentre valor, break; para salir del bucle for.

¿Es esto una mala práctica? He visto la alternativa utilizada: defina una variable vFound y vFound en verdadero cuando se encuentre el valor y marque vFound la condición de enunciado for . ¿Pero es necesario crear una nueva variable solo para este propósito?

Estoy preguntando en el contexto de un C normal o C ++ for loop.

PD: Las pautas de codificación de MISRA desaconsejan el uso del descanso.


Depende de tu caso de uso. Hay aplicaciones en las que el tiempo de ejecución de un bucle for debe ser constante (por ejemplo, para satisfacer algunas restricciones de tiempo u ocultar sus datos internos de los ataques basados ​​en el tiempo).

En esos casos, incluso tendrá sentido establecer una bandera y solo verificar el valor de la bandera DESPUÉS de que se hayan ejecutado realmente todas las iteraciones de bucle for . Por supuesto, todas las iteraciones de bucle for deben ejecutar código que aún tarda aproximadamente el mismo tiempo.

Si no le importa el tiempo de ejecución ... use break; y continue; para hacer que el código sea más fácil de leer.


Depende del idioma Si bien es posible verificar una variable booleana aquí:

for (int i = 0; i < 100 && stayInLoop; i++) { ... }

no es posible hacerlo cuando se trata de una matriz:

for element in bigList: ...

De todos modos, break haría ambos códigos más legibles.


En las reglas de MISRA 98, que se utiliza en mi empresa en C dev, la declaración de interrupción no se utilizará ...

Editar: Se permite el receso en MISRA ''04


En el mundo integrado, hay un montón de código que usa la siguiente construcción:

while(1) { if (RCIF) gx(); if (command_received == command_we_are_waiting_on) break; else if ((num_attempts > MAX_ATTEMPTS) || (TickGet() - BaseTick > MAX_TIMEOUT)) return ERROR; num_attempts++; } if (call_some_bool_returning_function()) return TRUE; else return FALSE;

Este es un ejemplo muy genérico, muchas cosas están sucediendo detrás de la cortina, interrupciones en particular. No use esto como un código repetitivo, solo estoy tratando de ilustrar un ejemplo.

Mi opinión personal es que no hay nada de malo en escribir un bucle de esta manera, siempre que se tome la precaución adecuada para evitar permanecer en el ciclo indefinidamente.


En su ejemplo, no conoce el número de iteraciones para el ciclo for . ¿Por qué no usar while loop en su lugar, lo que permite que el número de iteraciones sea indeterminado al principio?

Por lo tanto, no es necesario utilizar el parámetro de corte en general, ya que el ciclo se puede establecer mejor como un ciclo while.


Es perfectamente válido usar el break , como han señalado otros, no está en la misma liga que goto .

Aunque es posible que desee utilizar la variable vFound cuando desee verificar fuera del bucle si el valor se encontró en la matriz. También desde el punto de vista de la mantenibilidad, tener una bandera común que señale los criterios de salida podría ser útil.


Estoy de acuerdo con otros que recomiendan usar el break . La obvia pregunta consecuente es por qué alguien recomendaría lo contrario? Bueno ... cuando usas break, te saltas el resto del código en el bloque y las iteraciones restantes. A veces esto causa errores, por ejemplo:

  • un recurso adquirido en la parte superior del bloque puede soltarse en la parte inferior (esto es cierto incluso para bloques dentro for bucles), pero ese paso de liberación puede omitirse accidentalmente cuando una salida "prematura" es causada por una declaración de break (en " se usa el moderno "C ++," RAII "para manejar esto de una manera confiable y segura para excepciones: básicamente, los destructores de objetos liberan recursos confiablemente sin importar cómo se abandona un alcance)

  • alguien puede cambiar la prueba condicional en la instrucción for sin notar que hay otras condiciones de salida deslocalizadas

  • La respuesta de ndim observa que algunas personas pueden evitar las break para mantener un tiempo de ciclo de bucle relativamente constante, pero que estaba comparando la break con el uso de una variable de control de salida temprana booleana, donde eso no es válido.

De vez en cuando las personas que observan estos errores se dan cuenta de que pueden ser prevenidos / mitigados por esta regla de "no interrupciones" ... de hecho, hay toda una estrategia relacionada para la programación "segura" llamada "programación estructurada", donde se supone que cada función una entrada única y un punto de salida también (es decir, no goto, no return temprano). Puede eliminar algunos errores, pero sin duda introduce otros. ¿Por qué lo hacen?

  • tienen un marco de desarrollo que alienta un estilo particular de programación / código, y tienen evidencia estadística de que esto produce un beneficio neto en ese marco limitado, o
  • han sido influenciados por pautas de programación o experiencia dentro de dicho marco, o
  • solo son idiotas dictatoriales, o
  • cualquiera de las anteriores + inercia histórica (relevante en que las justificaciones son más aplicables a C que a C ++ moderno).

Hice algunos análisis sobre la base de código en la que estoy trabajando actualmente (40,000 líneas de JavaScript).

Encontré solo 22 declaraciones de break , de ellas:

  • 19 se usaron dentro de las declaraciones switch (¡solo tenemos 3 declaraciones switch en total!).
  • 2 se usaron dentro for bucles, un código que inmediatamente clasifiqué para que se refabricara en funciones separadas y se reemplazara por declaración de return .
  • En cuanto a la break final dentro del ciclo ... ¡ejecuté la git blame para ver quién escribió esta mierda!

Por lo tanto, de acuerdo con mis estadísticas: si el break se usa fuera del switch , es un olor a código.

También busqué continue declaraciones. No encontrado ninguno


Lejos de las malas prácticas, Python (¿y otros idiomas?) Extendió la estructura de bucle for , por lo que parte de ella solo se ejecutará si el bucle no se break .

for n in range(5): for m in range(3): if m >= n: print(''stop!'') break print(m, end='' '') else: print(''finished.'')

Salida:

stop! 0 stop! 0 1 stop! 0 1 2 finished. 0 1 2 finished.

Código equivalente sin break y ese práctico else :

for n in range(5): aborted = False for m in range(3): if not aborted: if m >= n: print(''stop!'') aborted = True else: print(m, end='' '') if not aborted: print(''finished.'')


Muchas respuestas aquí, pero no he visto esto mencionado aún:

La mayoría de los "peligros" asociados con el uso de break o continue en un bucle for se anulan si se escriben bucles ordenados y fáciles de leer. Si el cuerpo de su bucle abarca varias longitudes de pantalla y tiene múltiples subbloques anidados, sí, fácilmente podría olvidar que algún código no se ejecutará después del salto. Sin embargo, si el ciclo es corto y va al grano, el propósito de la declaración de interrupción debería ser obvio.

Si un bucle se está haciendo demasiado grande, use una o más llamadas de función bien nombradas dentro del bucle. La única razón real para evitar hacerlo es para procesar los cuellos de botella.


No hay nada intrínsecamente incorrecto con el uso de una sentencia break, pero los bucles anidados pueden ser confusos. Para mejorar la legibilidad, muchos lenguajes ( al menos Java ) admiten romper las etiquetas, lo que mejorará enormemente la legibilidad.

int[] iArray = new int[]{0,1,2,3,4,5,6,7,8,9}; int[] jArray = new int[]{0,1,2,3,4,5,6,7,8,9}; // label for i loop iLoop: for (int i = 0; i < iArray.length; i++) { // label for j loop jLoop: for (int j = 0; j < jArray.length; j++) { if(iArray[i] < jArray[j]){ // break i and j loops break iLoop; } else if (iArray[i] > jArray[j]){ // breaks only j loop break jLoop; } else { // unclear which loop is ending // (breaks only the j loop) break; } } }

Diré que las declaraciones de interrupción (y devolución) a menudo aumentan la complejidad ciclomática, lo que hace que sea más difícil probar que el código está haciendo lo correcto en todos los casos.

Si está considerando usar un descanso mientras itera sobre una secuencia de un elemento en particular, puede reconsiderar la estructura de datos utilizada para almacenar sus datos. Usar algo como un Conjunto o Mapa puede proporcionar mejores resultados.


No veo ninguna razón por la que sería una mala práctica SIEMPRE que desee completar el procesamiento de STOP en ese momento.


No, romper es la solución correcta.

Agregar una variable booleana hace que el código sea más difícil de leer y agrega una posible fuente de errores.


Por supuesto, break; es la solución para detener el bucle for o foreach. Lo usé en php en foreach y en loop y encontré que funcionaba.


Puede encontrar todo tipo de código profesional con declaraciones de "interrupción" en ellos. Tiene sentido usar esto cuando sea necesario. En su caso, esta opción es mejor que crear una variable separada solo con el propósito de salir del ciclo.


Regla general: si seguir una regla requiere que hagas algo más incómodo y difícil de leer luego de infringir la regla, entonces rompe la regla.

En el caso de un bucle hasta que encuentre algo, se encontrará con el problema de distinguir entre lo encontrado y lo no encontrado cuando salga. Es decir:

for (int x=0;x<fooCount;++x) { Foo foo=getFooSomehow(x); if (foo.bar==42) break; } // So when we get here, did we find one, or did we fall out the bottom?

De acuerdo, puede establecer un indicador o inicializar un valor "encontrado" como nulo. Pero

Es por eso que, en general, prefiero llevar mis búsquedas a funciones:

Foo findFoo(int wantBar) { for (int x=0;x<fooCount;++x) { Foo foo=getFooSomehow(x); if (foo.bar==wantBar) return foo; } // Not found return null; }

Esto también ayuda a despejar el código. En la línea principal, "encontrar" se convierte en una declaración única, y cuando las condiciones son complejas, solo se escriben una vez.


Usar break así como continue en un bucle for está perfectamente bien.

Simplifica el código y mejora su legibilidad.


break es una declaración completamente aceptable de usar (así es continuar , por cierto). Todo se trata de la legibilidad del código, siempre y cuando no tenga bucles complicados y eso está bien.

No es como si fueran la misma liga que goto . :)