Reclamation

Plusieurs instructions peuvent être regroupées en une seule en les regroupant entre accolades. Un tel groupement est considérée comme une “instruction composée” (compound statement) ou un “agrégat d’instruction”.

Plusieurs instructions peuvent être dépendante d’un même if si elles sont groupées dans un tel bloc, ce if commandera à l’entièreté du bloc.

#include<stdio.h>

main() {

    if(getchar() == 'a) { 
        
        // chacune ou aucune instruction du bloc sera exécutée
        // en fonction du test
        
        puts("Bonjour ");
        puts("a ");
        puts("tous !\n");
    }

    puts("Au revoir.\n");
}

Observez ce qui se passe si vous enlevez les accolades et entrez la lettre ‘a’ avec le programme ci-dessous :

#include<stdio.h>

main() {

    if(getchar() == 'a') 
        puts("Bonjour ");
        puts("a ");
        puts("tous !\n");

    puts("Au revoir.\n");
}

Ici seul le premier texte est conditionné à l’instruction if.

Un if, while, do ou for exécute soit l’instruction qui suit, soit l’aggrégat d’instructions qui suit. Il est généralement recommandé de systématiquement utiliser des accolades avec un if/while/do/for car elles permettent d’exécuter de zero à autant d’instructions voulues et facilitent la lecture.

Hormis leur utilité avec les structures de controle, les aggrégats ont la cara&ctéristique de définir une portee qui leur est propre. C’est à dire que le code suivant n’est pas valide

#include<stdio.h>

main() {

    {
        int a = 42;
    }
    
    printf("A vaut %d.\n", a); // incorrect, la variable a n'existe plus en dehors de son bloc
}

Cela permet d’encapsuler certains variables nécessaires sedulement à certains parties de vos fonctions mais présente également un risque quand un pointeur externe au bloc pointe sur cette variable.

#include<stdio.h>

main() {

    int* p;
    {
        int a = 42;
        p = &a;
    }
    
    printf("A vaut %d.\n", *p);

    {
        int b = 24;
    }

    printf("A vaut %d.\n", *p);
}

printf("A vaut %d.\n", *p); Ici, le pointeur *p peut afficher n’importe quoi. On dit aussi que le pointeur est « détache, errant ou vacant, divaguant » (dangling, littéralement pendouillant)

Il est possible que le deuxième printf affiche la valeur de b sans qu’on ait demandé au pointeur de pointer sur b, en conséquence de cette divagation.

Plusieurs types d’éléments définissent leur propre portée :

les blocs, les controles d’instruction et les paramètres de fonction.