1. Comparación de bucles: for vs. while

Un bucle while se puede usar en cualquier lugar donde una declaración o un grupo de declaraciones deban ejecutarse varias veces. Pero entre todos los escenarios posibles, uno vale la pena destacar.

Estamos hablando de la situación en la que el programador (el creador del programa) sabe de antemano cuántas veces se debe ejecutar el ciclo. Esto generalmente se maneja declarando una variable de contador especial y luego aumentando (o disminuyendo) la variable con 1cada iteración del bucle.

Todo parece funcionar como debería, pero no es muy conveniente. Antes del ciclo, establecemos el valor inicial de la variable contador. Luego, en la condición, verificamos si ya ha alcanzado el valor final. Pero generalmente cambiamos el valor al final del cuerpo del ciclo.

¿Y si el cuerpo del bucle es grande? ¿O si tenemos varios bucles anidados? En general, en estos casos es deseable recopilar toda esta información sobre las variables de contador en un solo lugar. Y es por eso que tenemos el forbucle en Java. Tampoco parece muy complicado:

for (statement 1; condition; statement 2)
{
   block of statements
}

Un whileciclo tiene solo una condición entre paréntesis, pero un forciclo agrega dos declaraciones, separadas por punto y coma.

La realidad es más simple de lo que parece: el compilador convierte un forbucle en un whilebucle ordinario como este:

statement 1;
while (condition)
{
   block of statements
   statement 2;
}

O mejor aún, demostremos esto con un ejemplo. Los dos fragmentos de código a continuación son idénticos.

Opción 1 opcion 2
for (int i = 0; i < 20; i++)
{
   System.out.println(i);
}
int i = 0;
while (i < 20)
{
   System.out.println(i);
   i++;
}

Acabamos de reunir en un solo lugar todo el código que pertenece a la ivariable de contador.

En un forciclo, la declaración 1 se ejecuta solo una vez, antes de que comience el ciclo. Esto se puede ver claramente en el segundo fragmento de código

la instrucción 2 se ejecuta el mismo número de veces que el cuerpo del ciclo, y cada vez se ejecuta después de que se haya ejecutado todo el cuerpo del ciclo


2. Dónde forse usa el bucle

El forbucle es probablemente el tipo de bucle más utilizado en Java. Se usa en todas partes, para los programadores es más claro y más conveniente que un whilebucle. Prácticamente cualquier whilebucle se puede convertir en un forbucle.

Ejemplos:

mientras bucle en bucle
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
for (int i = 3; i >= 0; i--)
{
   System.out.println(i);
}
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
for (int i = 0; i < 3; i++)
{
   System.out.println(i);
}
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
for (boolean isExit = false; !isExit; )
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
while (true)
   System.out.println("C");
for (; true; )
   System.out.println("C");
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}
for (; true; )
{
   String s = console.nextLine();
   if (s.equals("exit"))
      break;
}

Presta atención al último ejemplo. Faltan las sentencias para trabajar con el contador de bucles. No hay contador ni declaración.

En un forbucle, Java le permite omitir la "instrucción para inicializar el contador" y la "instrucción para actualizar el contador". Incluso se puede omitir la expresión que define la condición del bucle.



3. Matices de usar el forbucle.

Un punto importante sobre el uso forde bucles breaky continuedeclaraciones.

Una breakinstrucción en un forbucle funciona igual que en un whilebucle: finaliza el bucle inmediatamente. Una continuedeclaración salta el cuerpo del bucle, pero no statement 2(lo que cambia el contador del bucle).

Echemos otro vistazo a cómo se relacionan los bucles fory while.

for (statement 1; condition; statement 2)
{
   block of statements
}
statement 1;
while (condition)
{
   block of statements
   statement 2;
}

Si una continuesentencia se ejecuta en un forbucle , entonces el resto del bloque de sentencias se salta, pero la sentencia 2 (la que funciona con la forvariable de contador del bucle) aún se ejecuta.

Volvamos a nuestro ejemplo saltando números que son divisibles por 7.

Este código se repetirá para siempre Este código funcionará bien
int i = 1;
while (i <= 20)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
   i++;
}
for (int i = 1; i <= 20; i++)
{
   if ( (i % 7) == 0) continue;
   System.out.println(i);
}

El código que usa el whilebucle no funcionará; i nunca será mayor que 7. Pero el código con el forbucle funcionará bien.



4. Comparación de bucles: Java vs Pascal

Por cierto, Pascal también tiene un Forbucle. En general, esencialmente cada lenguaje de programación tiene uno. Pero en Pascal es súper claro. Ejemplos:

Pascal Java
For i := 1 to 10 do
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i++)
{
   System.out.println(i);
}
For i := 1 to 10 do step 2
Begin
   Writeln(i);
End;
for (int i = 1; i <= 10; i = i + 2)
{
   System.out.println(i);
}
For i := 10 downto 0 do step 2
Begin
   Writeln(i);
End;
for (int i = 10; i >= 0; i = i - 2)
{
   System.out.println(i);
}