Variables et constantes en C-C++

28 Aug 2019 28 Aug 2019 13615 vues ESSADDOUKI Mostafa 8 min de lecture

Variables et constantes en C

Définition — Variable Une variable est un espace mémoire nommé auquel le compilateur alloue une zone de stockage. Elle possède trois attributs essentiels : un type (détermine la taille et les opérations permises), un nom (identifiant unique) et une valeur (contenu pouvant évoluer pendant l'exécution).
AttributDescriptionExemple
TypeNature de la donnée stockéeint, float, char
NomIdentifiant unique dans la portéeage, nb_eleves
ValeurContenu de la zone mémoire25, 3.14, 'A'
AdresseEmplacement physique en mémoire0x7ffd2c4 (fournie par &var)

1. Déclaration et initialisation


Syntaxe C
/* Déclaration sans initialisation */
type nom_variable;

/* Déclaration avec initialisation */
type nom_variable = valeur;

/* Plusieurs variables du même type */
type var1, var2, var3;

/* Plusieurs variables avec initialisations mixtes */
type var1 = valeur1, var2, var3 = valeur3;

Exemple n°1 — Déclarations et initialisations

#include <stdio.h>

int main(void)
{
    int    age;              /* déclarée, non initialisée (valeur indéfinie) */
    int    annee = 2024;     /* déclarée et initialisée */
    float  b = 1.5, c;      /* b initialisée, c non initialisée */
    char   lettre = 'A';    /* caractère */
    double pi = 3.14159;    /* réel double précision */

    age = 20;               /* affectation après déclaration */

    printf("age    = %d\n",  age);
    printf("annee  = %d\n",  annee);
    printf("b      = %.1f\n", b);
    printf("lettre = %c\n",  lettre);
    printf("pi     = %f\n",  pi);

    return 0;
}
Sortie
age    = 20
annee  = 2024
b      = 1.5
lettre = A
pi     = 3.141590
Attention — Variable non initialisée En C, une variable locale non initialisée contient une valeur indéterminée(ce qui reste en mémoire à cet emplacement). L'utiliser avant de lui affecter une valeur produit un comportement indéfini :
int x;
printf("%d\n", x);  /* comportement indéfini — valeur aléatoire */

int y = 0;
printf("%d\n", y);  /* sûr — affiche 0 */

C est un langage fortement typé

En C, le type d'une variable est fixé à la déclaration et ne peut pas être modifié. Toute tentative de redéclaration ou d'affectation d'un type incompatible provoque une erreur.

Exemple n°2 — Erreurs de typage

int a;
a = 5.6;    /* Attention : 5.6 est tronqué → a vaut 5 (pas d'erreur, mais perte de données) */
float a;    /* Erreur de compilation : redéclaration de "a" dans la même portée */

/* Correct : déclarer le bon type dès le départ */
float b = 5.6;   /* b vaut 5.6 */
int   c = 5;     /* c vaut 5   */
Danger — Troncature silencieuse Affecter un float à un intne génère pas toujours une erreur en C — la partie décimale est silencieusement tronquée. Ce comportement peut introduire des bugs difficiles à détecter :
int x = 9.99;     /* x vaut 9  — pas d'erreur, mais perte de .99 */
int y = -2.7;     /* y vaut -2 — troncature vers zéro            */

/* Solution : utiliser le bon type ou un cast explicite */
float f = 9.99;
int   n = (int)f;  /* cast explicite — intention claire */

2. Constantes

Définition — Constante Une constante est une valeur fixée à la compilation qui ne peut pas être modifiée pendant l'exécution du programme. En C, on peut définir des constantes de deux façons : avec le qualificateur const ou avec la directive de préprocesseur #define.
MéthodeSyntaxeType vérifiéPortée
constconst double PI = 3.14;OuiPortée de la déclaration
#define#define PI 3.14Non (substitution textuelle)Depuis la directive jusqu'à la fin du fichier

Exemple n°3 — Déclaration de constantes

#include <stdio.h>
#define TAILLE_MAX 100         /* constante préprocesseur */

int main(void)
{
    const double PI = 3.14159;  /* constante typée */
    const int    NB_JOURS = 7;

    printf("PI        = %f\n", PI);
    printf("NB_JOURS  = %d\n", NB_JOURS);
    printf("TAILLE_MAX = %d\n", TAILLE_MAX);

    return 0;
}

Exemple n°4 — Tentative de modification d'une constante

const double PI = 3.14;
PI = 4.6;   /* Erreur de compilation : assignment of read-only variable 'PI' */
Astuce — const vs #define Préférer const à #define pour les constantes numériques : le type est vérifié par le compilateur, la constante apparaît dans le débogueur et sa portée est contrôlée. Réserver #define aux macros de préprocesseur et aux gardes d'inclusion.

3. Variables statiques

Définition — Variable statique Une variable statique est une variable dont la durée de vie est celle du programme entier, quelle que soit sa portée lexicale. Contrairement aux variables locales (automatiques), elle n'est pas détruite à la fin de l'appel de fonction et conserve sa valeur entre les appels.

Syntaxe C
static type nom_variable = valeur;

Exemple n°5 — Variable statique vs variable automatique

#include <stdio.h>

/* Version avec variable statique — cpt persiste entre les appels */
int tester_static(void)
{
    static int cpt = 0;  /* initialisée une seule fois */
    cpt++;
    return cpt;
}

/* Version avec variable automatique — cpt réinitialisée à chaque appel */
int tester_auto(void)
{
    int cpt = 0;         /* réinitialisée à chaque appel */
    cpt++;
    return cpt;
}

int main(void)
{
    printf("--- Variable statique ---\n");
    printf("Appel 1 : %d\n", tester_static());   /* 1 */
    printf("Appel 2 : %d\n", tester_static());   /* 2 */
    printf("Appel 3 : %d\n", tester_static());   /* 3 */

    printf("--- Variable automatique ---\n");
    printf("Appel 1 : %d\n", tester_auto());     /* 1 */
    printf("Appel 2 : %d\n", tester_auto());     /* 1 */
    printf("Appel 3 : %d\n", tester_auto());     /* 1 */

    return 0;
}
Sortie
--- Variable statique ---
Appel 1 : 1
Appel 2 : 2
Appel 3 : 3
--- Variable automatique ---
Appel 1 : 1
Appel 2 : 1
Appel 3 : 1

Propriétés des variables statiques

PropriétéVariable automatique (auto)Variable statique (static)
Segment mémoirePile (stack)Segment de données
Durée de vieDurée de l'appel de fonctionDurée du programme entier
Valeur initiale par défautIndéterminée0 (zéro automatique)
RéinitialisationÀ chaque appelUne seule fois au démarrage
Portée lexicaleBloc de déclarationBloc de déclaration (inchangée)
Initialiseur autoriséExpression quelconqueConstante littérale uniquement
Danger — Initialiser une variable statique avec une fonction L'initialiseur d'une variable statique doit être une constante connue à la compilation. Utiliser une valeur de retour de fonction provoque une erreur :
int initializer(void) { return 5; }

int main(void)
{
    static int i = initializer();  /* Erreur : initializer element is not a compile-time constant */
    static int j = 5;              /* Correct : littéral constant */
    return 0;
}
Variable statique globale — Limiter la portée à un fichier Le mot-clé static appliqué à une variable ou une fonction globalerestreint sa visibilité au fichier source courant. C'est un mécanisme d'encapsulation au niveau fichier, utile pour éviter les conflits de noms dans les projets multi-fichiers :
/* fichier calcul.c */
static int compteur = 0;    /* visible uniquement dans calcul.c */
static void aide(void) { } /* fonction locale au fichier        */

int publique(void) { return ++compteur; }  /* visible de l'extérieur */
Attention — Variable statique dans une structure Un membre de structure ne peut pas être déclaré static. Le compilateur C exige que tous les membres d'une structure soient contigus en mémoire (le décalage de chaque champ est calculé depuis l'adresse de base de la structure). Placer un membre dans le segment de données briserait cette contiguïté. En revanche, une variable de type structureentière peut être déclarée statique :
struct Point {
    int x;
    static int compteur;  /* Erreur : membre static interdit */
};

/* Correct : la structure entière est statique */
static struct Point origine = {0, 0};

Récapitulatif

ConceptMot-clé / SyntaxeCaractéristique cléPiège courant
Variable localetype nom;Portée : bloc de déclarationValeur indéfinie si non initialisée
Variable globaleDéclarée hors de toute fonctionInitialisée à 0, durée = programmeCouplage implicite entre fonctions
Constante constconst type nom = val;Type vérifié, non modifiableOublier const → modification accidentelle
Constante #define#define NOM valSubstitution textuelle, sans typePas de vérification de type
Variable statique localestatic type nom = val;Persiste entre les appelsInitialiseur doit être une constante littérale
Variable statique globalestatic type nom; (global)Portée limitée au fichierNon accessible depuis un autre fichier

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.