Namespaces
Variants

for loop

From cppreference.net

Ejecuta un bucle.

Utilizado como equivalente más corto del bucle while .

Contenidos

Sintaxis

attr-spec-seq (desde C23) (opcional) for ( init-clause ; cond-expression ; iteration-expression ) loop-statement

Explicación

Se comporta de la siguiente manera:

  • init-clause puede ser una expresión o una declaración (desde C99) .
  • Una init-clause , que es una expresión, se evalúa una vez, antes de la primera evaluación de cond-expression y su resultado se descarta.
  • Una init-clause , que es una declaración, está en alcance en todo el cuerpo del bucle, incluyendo el resto de la init-clause , toda la cond-expression , toda la iteration-expression y toda la loop-statement . Solo se permiten los auto y register storage class specifiers para las variables declaradas en esta declaración.
(desde C99)
  • cond-expression se evalúa antes del cuerpo del bucle. Si el resultado de la expresión es cero, la sentencia del bucle se abandona inmediatamente.
  • iteration-expression se evalúa después del cuerpo del bucle y su resultado se descarta. Después de evaluar iteration-expression , el control se transfiere a cond-expression .

init-clause , cond-expression , y iteration-expression son todos opcionales. Si se omite cond-expression , se reemplaza con una constante entera distinta de cero, lo que hace que el bucle sea infinito:

for(;;) {
   printf("¡bucle infinito!");
}

loop-statement no es opcional, pero puede ser una sentencia nula:

for(int n = 0; n < 10; ++n, printf("%d\n", n))
    ; // sentencia nula

Si la ejecución del bucle necesita terminarse en algún punto, una break statement puede usarse en cualquier lugar dentro del loop-statement .

La sentencia continue utilizada en cualquier lugar dentro del loop-statement transfiere el control a la iteration-expression .

Un programa con un bucle infinito tiene comportamiento indefinido si el bucle no tiene comportamiento observable (E/S, accesos volátiles, operaciones atómicas o de sincronización) en ninguna parte de su cond-expression , iteration-expression o loop-statement . Esto permite a los compiladores optimizar eliminando todos los bucles no observables sin probar que terminan. Las únicas excepciones son los bucles donde cond-expression se omite o es una expresión constante; for ( ;; ) siempre es un bucle infinito.

Al igual que todas las demás sentencias de selección e iteración, la sentencia for establece ámbito de bloque : cualquier identificador introducido en la init-clause , cond-expression , o iteration-expression sale del ámbito después de la loop-statement .

(since C99)

attr-spec-seq es una lista opcional de atributos , aplicados a la sentencia for .

(desde C23)

Palabras clave

for

Notas

La sentencia de expresión utilizada como loop-statement establece su propio ámbito de bloque, distinto del ámbito de init-clause , a diferencia de C++:

for (int i = 0; ; ) {
    long i = 1;   // C válido, C++ inválido
    // ...
}

Es posible ingresar al cuerpo de un bucle utilizando goto . Al ingresar a un bucle de esta manera, init-clause y cond-expression no se ejecutan. (Si el control luego alcanza el final del cuerpo del bucle, puede ocurrir repetición incluyendo la ejecución de cond-expression .)

Ejemplo

#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
    int array[SIZE];
    for(size_t i = 0 ; i < SIZE; ++i)
        array [i] = rand() % 2;
    printf("Array filled!\n");
    for (size_t i = 0; i < SIZE; ++i)
        printf("%d ", array[i]);
    putchar('\n');
}

Salida posible:

Array filled!
1 0 1 1 1 1 0 0

Referencias

  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.8.5.3 La sentencia for (p: 110)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.8.5.3 La sentencia for (p: 151)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 6.8.5.3 La sentencia for (p: 136)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 3.6.5.3 La sentencia for

Véase también