for loop
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.
|
(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
|
(desde C23) |
Palabras clave
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
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
|
Documentación de C++
para
for
loop
|