¿Cómo funciona un bucle for, específicamente para (;;)?

Revisando un viejo código de empresa, encontré un bucle for que se ve así:

for (;;) { //Some stuff } 

Intenté Google pero no pude encontrar ninguna respuesta. ¿Me dormí en una clase de progtwigción o es un ciclo inusual?

Un bucle for en java tiene la siguiente estructura:

 for (initialization statement; condition check; update) loop body; 

Como puede ver, hay cuatro declaraciones aquí –

  1. Instrucción de inicialización: esta instrucción se ejecuta solo una vez, cuando se ingresa el ciclo por primera vez. Esta es una statement opcional, lo que significa que puede elegir mantener este campo en blanco. En general, se usa para algunos fines de inicialización.
  2. Cheque condicional: esta afirmación es probablemente la más importante. Verifica para verificar si cierta expresión se evalúa como verdadera. Si es así, entonces la ejecución del ciclo continúa. Puede optar por mantener este campo vacío, que se evaluará como true .
  3. Actualización: esta lista de instrucciones se ejecuta de izquierda a derecha, normalmente se usa para incrementar / disminuir alguna variable.
  4. cuerpo de bucle: El cuerpo del bucle, que se ejecutará una y otra vez en función del valor de verdad del cheque condicional.

Básicamente, así es como sigue la ejecución: primero, cuando se ingresa el ciclo por primera vez, la instrucción de inicialización se ejecuta una vez. Luego se ejecuta la verificación condicional para ver si se evaluó como verdadero. Si es así, entonces se ejecuta el cuerpo del bucle, de lo contrario, la ejecución del bucle finaliza. Después de eso, la (s) statement (es) de actualización se (son) ejecutan. A continuación, la comprobación condicional se ejecuta de nuevo, y si se evalúa como verdadera, entonces nuevamente se ejecuta el cuerpo del bucle, luego se ejecuta la instrucción de actualización, luego otra vez la comprobación condicional … se obtiene la imagen.

Ahora acerca de su syntax de (;; for( ; ; ) . No tiene instrucción de inicialización, por lo que no se ejecutará nada. Su statement de verificación condicional también está vacía, lo que significa que se evalúa como verdadera. Después de eso, se ejecuta el cuerpo del bucle. A continuación, dado que la statement de actualización está vacía, no se ejecuta nada. Luego se realiza de nuevo la verificación condicional, que nuevamente se evalúa como verdadera y luego todo este proceso volverá a repetirse.

Como puede ver, esto es básicamente un ciclo infinito que no tiene instrucción de inicialización, cuya verificación condicional siempre se evalúa como verdadera y no tiene una statement de actualización. Esto es equivalente a –

 while(true) { ..... } 

que es otra construcción popular de bucle en java.

Cuando utiliza un ciclo infinito como este, es importante prestar atención a la condición de interrupción ya que en la mayoría de los casos no puede dejar que un ciclo se ejecute indefinidamente. Para salir de este tipo de bucles, puede usar la statement de break . La estructura es la siguiente:

 if(some_condition_is_true) break; // This will cause execution to break out of its nearest loop 

o

 if(some_condition_is_false) break; 

Esto es lo mismo que:

 while(true) { //Some Stuff } 

Básicamente, una syntax alternativa para un bucle infinito.

Estos son todos bucles infinitos

 for(;;) { // endlessly } while(true) { // endlessly } do { // endlessly } while(true); 

Este ciclo no tiene protección y actúa como un ciclo while (verdadero). Bucle infinito hasta un descanso.

Es un ciclo infinito. No es exactamente una buena encoding porque no es intuitivo que comstackría o no arrojaría un error de tiempo de ejecución. Reescribir como while(true) { /* code */ } sería mucho más legible para indicar un ciclo infinito.

Es un ciclo infinito. Las instrucciones de inicialización, condición e incremento son todas opcionales, por lo que sin ninguna de ellas, siempre se repetirá (a menos que se golpee una interrupción o que otra construcción interactúe con ella).

Aunque no estoy seguro acerca de Java, esta pregunta explica cómo en .Net su vacío for un while (true) se comstackrá exactamente de la misma manera. No me sorprendería que Java también lo haga.

    Intereting Posts