1.2 Variables
1.2.1 Déclarations et utilisations de variables
Considérons l'instruction C suivante, qui affiche le nombre 5, et son carré :
printf("Le nombre %d a pour carré %dn", 5, 5 * 5);
Supposons maintenant que nous souhaitions afficher le carré d'un autre nombre, par exemple 238. L'instruction devient alors :
|
|
printf("Le nombre %d a pour carré %dn", 238, 238 * 238);
Nous avons dû changer trois fois le nombre 5 en nombre 238. Imaginez que nous souhaitions ensuite afficher le carré du nombre 123458, il faudrait de nouveau taper ce nombre trois fois. Il est possible d'écrire notre programme différemment de telle sorte qu'on puisse ensuite changer ce nombre en une seule modification. Il faut pour cela utiliser une variable :
#include <stdio.h>
int main()
{
int nombre;
nombre = 238;
printf("Le nombre %d a pour carré %dn", nombre, nombre * nombre);
return 0;
}
Dans cette nouvelle version, on a remplacé dans le printf la valeur 238 par le mot nombre
. Les deux lignes qui précèdent font en sorte que l'utilisation de ce mot soit équivalente à l'utilisation de la valeur 238 :
int nombre;
indique que le mot nombre
va désormais représenter une valeur entière : int
est l'abréviation du mot anglais "Integer", qui signifie nombre entier. Cette ligne est une déclaration de variable, c'est à dire que l'on déclare qu'un identifiant (ici le mot nombre
) sera désormais associé à une valeur, ici un entier.
nombre = 238;
indique que lors des instructions suivantes, la variable nombre
aura pour valeur 238. Le nom variable signifie que la valeur que l'on associe à l'identifiant peut changer au cours du temps. Cette valeur n'est donc pas définitive et pourra être changée par d'autres instructions comme celle-ci.
Grâce à l'utilisation d'une variable, le nombre 238 n'apparaît plus qu'une seule fois et peut se changer en un seul remplacement.
L'instruction "nombre = 238;"
est ce que l'on appelle une affectation. Le signe "=" indique que l'on va affecter la valeur à droite du signe, à la variable indiquée à sa gauche. Ce que l'on met à droite n'est pas nécessairement un simple entier : il peut par exemple s'agir d'une expression mathématique, qui doit être calculée, avant d'être affectée à la variable. Par exemple l'instruction "nombre = 238 + 42 * 42;"
permet d'affecter à la variable "nombre"
le résultat du calcul de l'expression "238 + 42 * 42"
, c'est-à-dire 2002
.
On peut traduire l'instruction "int nombre;"
en français comme ceci :
Définis que dans toutes les instructions qui suivent, "nombre" représente une variable entière.
Si l'on traduit en français "nombre = ... ;", cela donne :
On a utilisé le mot (l'identifiant) "nombre" pour y associer une valeur. On aurait très bien pu prendre comme nom n'importe quel mot satisfaisant à la règle suivante :
Un identifiant doit être formé de lettres minuscules ou majuscules (de a à z, ou de A à Z), de chiffres, et de caractères soulignés (le symbole "_", appelé underscore en anglais). Il ne doit en outre pas commencer par un chiffre, ni contenir d’espaces, de lettres accentuées ou tout autre caractère spécial.
Remarque : dans les premières versions du langage C, on ne pouvait pas placer de déclarations de variables n'importe où dans le programme : les déclarations devaient être en début de bloc (apprès l'accolade ouvrante), avant toute autre instruction. Ceci a été changé depuis le standard C99
, mais tous les compilateurs ne le permettent pas.
Exercice : parmi les propositions suivantes, lesquelles ne correspondent pas à des identifiants valides ?
- hauteur
- épaisseur
- POIDS
- niveau_d'eau
- _Longueur_
- longueur_plus_2
- 2_fois_longueur
Solution : Les propositions suivantes ne sont pas des identifiants valides :
- épaisseur (car il contient une lettre accentuée)
- niveau_d'eau (car il contient une apostrophe)
- 2_fois_longueur (car il commence par un chiffre)
Les autres propositions sont bien des identifiants.
Exercice : écrivez un programme qui pour deux valeurs entières 42 et 38 données, affiche leur somme, leur différence, puis leur produit. Les valeurs affichées devront être séparées par un espace.
Solution :
#include <stdio.h>
int main()
{
int nombre1;
int nombre2;
nombre1 = 42;
nombre2 = 38;
printf("%d %d %dn", nombre1 + nombre2, nombre1 - nombre2, nombre1 * nombre2);
return 0;
}
1.2.2 Erreurs de compilation
Essayez de compiler le programme C suivant et trouvez l'erreur :
#include <stdio.h>
int main()
{
int nombre1,
int nombre2;
nombre1 = 42;
nombre2 = 38;
printf("%dn", nombre1 * nombre2);
return 0;
}
Le compilateur affiche des messages d'erreurs dans ce genre :
test.c: In function `main':
test.c:6: error: syntax error before "int"
test.c:8: error: `nombre2' undeclared (first use in this function)
test.c:8: error: (Each undeclared identifier is reported only once
test.c:8: error: for each function it appears in.)
Le message "syntax error before 'int' " nous indique qu'une erreur de syntaxe est détectée au moment de la lecture du mot "int", sur la ligne 6. La problème se situe avant ("before" en anglais), c'est à dire à la ligne précédente, qui se termine par une virgule, et non un point virgule.
Le message suivant indique en fait une autre erreur : le compilateur n'ayant pas réussi à compiler l'instruction invalide se trouvant à la ligne 6, il l'ignore et lit la suite, pour détecter d'éventuelles autres erreurs. "'nombre2' undeclared
" indique que l'identifiant "nombre2
" n'a pas été déclaré. En effet, la déclaration correspondante qui se trouvait à la ligne 6 était invalide et a été ignorée.
La suite du message est une remarque indiquant que c'est la première fois que cet identifiant est utilisé, et que le compilateur n'affichera pas d'erreur pour les autres utilisations.
1.2.3 Ecriture simplifiée
On peut remarquer qu'après une déclaration de variable, se trouve nécessairement une affectation d'une valeur à cette variable. En effet, si l'on déclare une variable sans l'initialiser, c'est-à-dire lui affecter ensuite une valeur, elle pourra contenir n'importe quoi. Afficher cette variable ou l'utiliser dans des calculs sans l'avoir initialisé donnera des résultats aléatoires, sans intérêt.
Plutôt que d'avoir à écrire systématiquement deux instructions, la déclaration d'une variable et son initialisation à une valeur :
int nombre;
nombre = 42;
Il est possible de n'écrire qu'une seule instruction :
int nombre = 42;
Cette instruction simplifiée doit être considérée comme une déclaration, donc elle ne doit être précédée que par des déclarations et peut être suivie d'autres déclarations
- calcule la valeur de l’expression entre le signe = et le ';',
- remplace le mot "
nombre
" par cette valeur dans les instructions qui suivent,
- passe alors à l’exécution de la suite.