Java Flow Control: instrucciones while y do-while

Las declaraciones condicionales y los bucles son una herramienta muy importante en la programación. No hay muchas cosas que podamos hacer con un código que solo puede ejecutarse línea por línea...

Introducción

Las declaraciones condicionales y los bucles son una herramienta muy importante en la programación. No hay muchas cosas que podamos hacer con un código que solo puede ejecutarse línea por línea.

Eso es lo que significa "control de flujo": guiar la ejecución de nuestro programa, en lugar de dejar que se ejecute línea por línea, independientemente de cualquier factor interno o externo. Cada lenguaje de programación admite alguna forma de control de flujo, si no explícitamente a través de ifs y fors o declaraciones similares, implícitamente nos brinda las herramientas para crear tales construcciones, es decir, los lenguajes de programación de bajo nivel generalmente logran ese efecto con una gran cantidad de comandos go-to.

Los bucles eran un concepto utilizado mucho antes de que existiera la programación informática, pero la primera persona en utilizar un bucle de software fue Ada Lovelace, comúnmente conocida por su apellido de soltera - Byron, mientras calculaba [Números de Bernoulli](https://en .wikipedia.org/wiki/Bernoulli_number), allá por el siglo XIX.

En Java, hay varias formas de controlar el flujo del código:

tiempo

Un bucle es un conjunto de instrucciones que se ejecutan repetidamente hasta que se cumple alguna condición o, alternativamente, mientras una condición sea “verdadera”. El bucle while en Java funciona según el último principio, repite un bloque de código siempre que la condición se evalúe como verdadera:

1
2
3
while(condition) {
    // Block of code to be executed
}

Cuando Java encuentra un bucle while, hace lo siguiente:

  • ¿Es verdadera la condición?
    • Yes -> execute the block of code. Check the condition again.
    • No -> don't execute the block of code. Don't check the condition again.

Esto significa que si tuviéramos una declaración como while(true), el bloque de código se ejecutaría indefinidamente (o al menos lo intentaría). Esto se denomina bucle infinito y debe evitarse a menos que tengamos una forma de salir del bucle, generalmente con una declaración break.

La condición puede ser cualquier tipo de expresión booleana, al igual que con las sentencias if.

Dado que while verifica la condición antes de ejecutar cualquier código, es posible que el bloque de código dentro del bucle while nunca se ejecute si la condición era falsa al principio.

Esto es diferente de un bucle for, que normalmente se ejecuta un número determinado de veces. Los bucles while, por otro lado, se utilizan a menudo para ejecutar un número desconocido de veces.

Aquí hay un ejemplo de un bucle while que suma todos los dígitos de un int.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
int n = 123;
int sumOfDigits = 0;

while(n > 0) {
    int lastDigit = n % 10; // Retrieves the last digit of n via the modulus operator
    n = n / 10; // "Removes" the last digit from n via division

    sumOfDigits += lastDigit; // Adds the current digit to the sum
}

System.out.println(sumOfDigits);

La ejecución de este código funciona de la siguiente manera:

  • La condición while está verificada, n es 123 y sumOfDigits es 0. ¿Es n > 0 igual a true? Sí -> ejecutar el código en el bucle.
  • La condición while está verificada, n es 12 y sumOfDigits es 3. ¿Es n > 0 igual a verdadero? Sí -> ejecutar el código en el bucle.
  • La condición while está verificada, n es 1 y sumOfDigits es 5. ¿Es n > 0 igual a true? Sí -> ejecutar el código en el bucle.
  • La condición while está verificada, n es 0 y sumOfDigits es 6. ¿Es n > 0 igual a verdadero? No -> ejecuta la primera línea después del ciclo, en nuestro caso imprime el resultado.

Después de ejecutar el bucle while 3 veces, se imprime un valor de 6 en la consola.

El cuerpo del bucle while puede estar vacío y, a veces, a los desarrolladores les gusta escribir bucles ‘while’ abreviados cuando es posible. Además, la misma regla de acortar las sentencias if y else se aplica a while. Por lo tanto, un bucle while de una sola línea se puede reescribir sin los corchetes, así:

1
2
3
4
5
6
7
8
// This...
while(i < j) {
    System.out.println("i " + i++ + "    j " + j--);
}

// ...becomes this:
while(i < j)
    System.out.println("i " + i++ + "    j " + j--);

También tenga en cuenta que las variables utilizadas en la condición marcada se pueden cambiar dentro del bloque de código de bucles while o dentro de la condición marcada en sí:

1
2
while(++i < --j)
    System.out.println("i "  + i + "   j " + j);

Ambos resultan en la misma salida:

1
2
3
4
i 1   j 9
i 2   j 8
i 3   j 7
i 4   j 6

Sin embargo, pueden reducir la legibilidad y deben evitarse si lo hacen.

hacer-mientras

Este bucle hace esencialmente lo mismo que while, pero garantiza que el bloque de código se ejecutará al menos una vez.

Esto se debe a que, a diferencia de while, el código se ejecuta antes de que se verifique la condición. Entonces, incluso si comenzamos con una condición falsa, ejecutará el código y luego verificará si debería hacerlo de nuevo:

1
2
3
4
5
6
7
int i = 0;

// This will print once
do {
    System.out.println(i);
    i--;
} while(i > 0);

La salida del código es:

1
0

Después de que el código llega a while(i > 0), detiene las iteraciones.

Por ejemplo, un caso de uso para do-while es preguntar al usuario si quiere intentar hacer algo de nuevo en caso de que falle.

1
2
3
4
5
6
7
do {
    // Try to connect to a server, access a resource, etc...
    String status = connectToServer();

    // Ask user whether they want to try again
    String userInput = getUserInput("Connection status is " + status + ". Want to try again?");
} while(userInput == "yes");

Esto se puede hacer con un ciclo while regular, pero es más legible e intuitivo de esta manera.

Conclusión

El control de flujo en el código es esencial para absolutamente todas las aplicaciones. Las declaraciones que alteran el flujo del código son bloques de construcción fundamentales y cada aspirante a desarrollador debe tener el control completo y ser consciente de cómo funcionan.

Los bucles while y do-while son buenos para ejecutar un bloque de código un número desconocido de veces, donde se verifica una condición cada vez que se vuelve a ejecutar el bloque de código.

Licensed under CC BY-NC-SA 4.0