Sentencia – for

El bucle for es es un bucle para ejecutar un bloque de sentencias un número fijo de veces. El bucle for se diferencia del bucle while en que las operaciones o condiciones de control del bucle se sitúan en un solo sitio: la cabecera de la sentencia. Por consiguiente, el bucle for es una sentencia iterativa que normalmente se utiliza con una variable de que se incrementa o decrementa. 

Sintaxis

  • for(Inicialización;Condición;Incremento)
         sentencia
  • for(Inicialización;Condición;Incremento)
    {
                sentencia_1
                sentencia_2
                sentencia_n
    }

El bucle for contiene las cuatro partes siguientes:

  • Parte de inicialización, que inicializa las variables de control del bucle.
  • Parte de condición, que contiene una expresión lógica que hace que el bucle realice las iteraciones o ciclos de las sentencias, mientras que la expresión sea verdadera.
  • Parte de incremento, que incrementa o decrementa la variable o variables de control del bucle.
  • Sentencias, acciones o instrucciones que se ejecutarán por cada iteración del bucle.

Precauciones en el uso de for

Un bucle for se debe construir con gran precaución, asegurándose que la expresión de incialización, la condición del bucle y la expresión de incremento harán que la condición del mismo se convierta en falso en algún momento. En particular «si el bloque de sentencias de un bucle de conteo modifica los valores de cualquier variable implicada en la condición del bucle, entonces el número de repeticiones o iteraciones se puede modificar».

Ejemplo

       for(int i=0;i>=0;i++){
               System.out.println(i);
       }

Observemos que produce una secuencia infinita de enteros (puede terminar si el compilador tiene constantes MAX_VALUE, con máximos valores enteros, entonces la ejecución terminará cuando i sea MAX_VALUE), ya que a cada iteración, la variable i++ incrementa i en 1. A consecuencia de ello, la condición del bucle i>=0 siempre es cierta.

Bucles infinitos

El uso principal de un bucle for es implementar bucles de conteo en el que el número de repeticiones se conoce por anticipado. Por ejemplo, la suma de enteros de 1 a n. Sin embargo, existen muchos problemas en los que el número de repeticiones no se puede determinar por anticipado. Para estas situaciones algunos lenguajes clásicos tienen sentencias específicas LOOP de Modula-2 Modula-3, el bucle DO de FORTRAN 90 o el bucle loop de Ada. Java no soporta una sentencia que realice esa tarea, pero existen una variante de la sintaxis de for que permite implementar bucles infinitos que son aquellos bucles que, en principio, no tienen fin.

Sintaxis

       for(;;)
            sentencia;

La sentencia se ejecuta indefinidamente y menos que se utilice una sentencia return o break (normalmente una combinación if-break o if-return).

La razón de que el bucle se ejecute indefinidamente es que se ha eliminado la expresión de inicialización, la condición del bucle y la expresión de incremento; al no existir una condición de bucle que especifique cuál es la condición para terminar la repetición o iteración de sentencias, supone que la condición es verdadera y éstas se ejecutarán indefinidamente. Por ejemplo:

       for(;;)
            System.out.println(«Hola mundo»);

producirá la salida:

      Hola mundo
      Hola mundo
      .
      .
      .

un número ilimitado de veces, a menos que el usuario interrumpa la ejecución (normalmente el usuario lo hace manualmente).

Para evitar esta situación, se requiere el diseño del bucle for de la forma siguiente:

  1. El bloque del bucle ha de contener todas las sentencias que se desean ejecutar repetidamente.
  2. Una sentencia terminará la ejecución del bucle cuando se cumpla una determinada condición.

La sentencia de terminación suele ser if-break con la sintaxis:

      if(condición) break;
      condición                  // es una expresión lógica
      break                          // termina la ejecución del bucle y transfiere
                                               el control a la sentencia siguiente al bucle
y la sintaxis completa:

      for(;;){                                       // inicio del bucle
           sentencia_1
           if(condición) break;
           sentencia_2
      }                                                 // fin del bucle
      sentencia_n                            puede ser vacía, simple o compuesta

Ejemplo

        // Bucle infinito, termina al ingresar -999
        final int CLAVE = -999;        // constante
        for(;;){
              System.out.print(«Ingresar numero: «);
              int numero = entrada.nextInt();
              if(numero==CLAVE) break;
        }

Los bucles for vacíos

Tenga cuidado de no situar un punto y coma después del paréntesis inicial del bucle for. Es decir, el bucle

        for(int i=1;i<=10;i++);             problema
                  System.out.println(«Betty Rodriguez»);

no se ejecuta correctamente, ni se visualiza el nombre «Betty Rodriguez» 10 veces como era de esperar, ni se produce un mensaje de error por parte del compilador. En realidad lo que sucede es que se visualiza una vez el nombre «Betty Rodriguez», ya que la sentencia for es una sentencia vacía al terminar con un punto y coma (;). Sucede que la sentencia for no hace absolutamente nada durante 10 iteraciones y, por lo tanto, después de que el bucle for haya terminado, se ejecuta la siguiente sentencia  System.out.println y se escribe «Betty Rodriguez».

A recordar

El bucle for con bloques vacíos puede tener algunas aplicaciones, especialmente cuando se requieren ralentizaciones o temporizaciones.

Sentencias nulas en bucles for

Cualquiera  o todas las expresiones de un bucle for pueden ser nulas. Para ejecutar esta acción, se utiliza el punto y coma (;) para marcar la expresión vacía. Si se desea crear un bucle for que actúe exactamente como un bucle while, se deben incluir las primeras y terceras expresiones vacías. El siguiente programa contiene un bucle for con la expresión de inicialización y de incremento vacías.

        int contador=0;
        for(;contador<5;){
             contador++;
             System.out.println(«¡Bucle!»);
        }
        System.out.println(«Contador: » + contador);

La sentencia for no inicializa ningún valor, pero incluye una prueba de contador<5. No existe ninguna sentencia de incremento, de modo que el bucle se comporta exactamente como la sentencia siguiente:

        int contador=0;
        while(contador<5)
        {
                contador++;
                System.out.println(«¡Bucle!»);
        }