Namespaces
Variants

for loop

From cppreference.net

Exécute une boucle.

Utilisé comme équivalent plus court de la boucle while .

Table des matières

Syntaxe

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

Explication

Se comporte comme suit :

  • init-clause peut être une expression ou une déclaration (depuis C99) .
  • Une init-clause , qui est une expression, est évaluée une fois, avant la première évaluation de cond-expression et son résultat est ignoré.
  • Une init-clause , qui est une déclaration, est dans la portée dans l'ensemble du corps de la boucle, incluant le reste de la init-clause , l'ensemble de la cond-expression , l'ensemble de la iteration-expression et l'ensemble du loop-statement . Seuls les auto et register storage class specifiers sont autorisés pour les variables déclarées dans cette déclaration.
(depuis C99)
  • cond-expression est évaluée avant le corps de la boucle. Si le résultat de l'expression est zéro, l'instruction de boucle est quittée immédiatement.
  • iteration-expression est évaluée après le corps de la boucle et son résultat est ignoré. Après l'évaluation de iteration-expression , le contrôle est transféré à cond-expression .

init-clause , cond-expression , et iteration-expression sont tous facultatifs. Si cond-expression est omis, il est remplacé par une constante entière non nulle, ce qui rend la boucle infinie :

for(;;) {
   printf("boucle infinie !");
}

loop-statement n'est pas facultatif, mais il peut s'agir d'une instruction nulle :

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

Si l'exécution de la boucle doit être interrompue à un certain moment, une instruction break peut être utilisée n'importe où dans la loop-statement .

L' instruction continue utilisée n'importe où dans la instruction-de-boucle transfère le contrôle vers l' expression-d-itération .

Un programme avec une boucle infinie a un comportement indéfini si la boucle n'a aucun comportement observable (E/S, accès volatiles, opérations atomiques ou de synchronisation) dans aucune partie de son cond-expression , iteration-expression ou loop-statement . Ceci permet aux compilateurs d'optimiser toutes les boucles non observables sans prouver qu'elles se terminent. Les seules exceptions sont les boucles où la cond-expression est omise ou est une expression constante ; for ( ;; ) est toujours une boucle infinie.

Comme toutes les autres instructions de sélection et d'itération, l'instruction for établit une portée de bloc : tout identifiant introduit dans la init-clause , cond-expression , ou iteration-expression sort de la portée après la loop-statement .

(depuis C99)

attr-spec-seq est une liste optionnelle d' attributs , appliquée à l'instruction for .

(depuis C23)

Mots-clés

for

Notes

L'instruction d'expression utilisée comme loop-statement établit sa propre portée de bloc, distincte de la portée de init-clause , contrairement au C++ :

for (int i = 0; ; ) {
    long i = 1;   // C valide, C++ invalide
    // ...
}

Il est possible d'entrer dans le corps d'une boucle en utilisant goto . Lorsqu'on entre dans une boucle de cette manière, init-clause et cond-expression ne sont pas exécutés. (Si le contrôle atteint ensuite la fin du corps de la boucle, une répétition peut survenir incluant l'exécution de cond-expression .)

Exemple

#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');
}

Sortie possible :

Array filled!
1 0 1 1 1 1 0 0

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.8.5.3 L'instruction for (p: 110)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 6.8.5.3 The for statement (p: 151)
  • Norme C99 (ISO/IEC 9899:1999) :
  • 6.8.5.3 L'instruction for (p: 136)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.6.5.3 L'instruction for

Voir aussi

Documentation C++ pour for loop