Variables et constantes en C
| Attribut | Description | Exemple |
|---|---|---|
| Type | Nature de la donnée stockée | int, float, char |
| Nom | Identifiant unique dans la portée | age, nb_eleves |
| Valeur | Contenu de la zone mémoire | 25, 3.14, 'A' |
| Adresse | Emplacement physique en mémoire | 0x7ffd2c4 (fournie par &var) |
1. Déclaration et initialisation
/* 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;
}age = 20 annee = 2024 b = 1.5 lettre = A pi = 3.141590
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 */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
const ou avec la directive de préprocesseur #define.| Méthode | Syntaxe | Type vérifié | Portée |
|---|---|---|---|
const | const double PI = 3.14; | Oui | Portée de la déclaration |
#define | #define PI 3.14 | Non (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' */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
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;
}--- 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émoire | Pile (stack) | Segment de données |
| Durée de vie | Durée de l'appel de fonction | Durée du programme entier |
| Valeur initiale par défaut | Indéterminée | 0 (zéro automatique) |
| Réinitialisation | À chaque appel | Une seule fois au démarrage |
| Portée lexicale | Bloc de déclaration | Bloc de déclaration (inchangée) |
| Initialiseur autorisé | Expression quelconque | Constante littérale uniquement |
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;
}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 */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
| Concept | Mot-clé / Syntaxe | Caractéristique clé | Piège courant |
|---|---|---|---|
| Variable locale | type nom; | Portée : bloc de déclaration | Valeur indéfinie si non initialisée |
| Variable globale | Déclarée hors de toute fonction | Initialisée à 0, durée = programme | Couplage implicite entre fonctions |
Constante const | const type nom = val; | Type vérifié, non modifiable | Oublier const → modification accidentelle |
Constante #define | #define NOM val | Substitution textuelle, sans type | Pas de vérification de type |
| Variable statique locale | static type nom = val; | Persiste entre les appels | Initialiseur doit être une constante littérale |
| Variable statique globale | static type nom; (global) | Portée limitée au fichier | Non accessible depuis un autre fichier |
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.