Variable
Pour qu'une donnée puisse être utilisée durant l'exécution d'un programme, il faut la stocker. Pour cela, on utilise des variables, concept-clé de la programmation. On peut voir simplement une variable comme étant une boite nommée dans laquelle il est possible de placer une donnée. La boite possède un nom, ce qui permet de l'identifier. De plus, dans une variable donnée, on ne pourra stocker que des données d'un même type choisi. Par exemple, si je crée une variable « nombre entier positif », je ne pourrais y stocker que des nombres entiers positifs.
Une variable est donc caractérisée par trois éléments :
- son nom permet de l'identifier ;
- son type détermine quelle donnée elle pourra stocker ;
- et sa valeur correspond à la donnée qu'elle stocke.
La figure 4 illustre le concept de variable comme étant une boite contenant une valeur. Son type est indiqué au-dessus de la boite, et son nom en-dessous.
Règle de nommage
Le nom que vous choisissez pour vos variables est très important, et ne peut pas être choisi n'importe comment. La première règle à respecter est qu'il est interdit d'utiliser un mot réservé comme nom de variable. Les mots réservés sont des mots qui ont une signification particulière pour le langage C. La figure 5 reprend tous les mots réservés du langage C, depuis la version K&R jusqu'à la version C11.
La deuxième règle qu'il faut respecter concerne les caractères autorisés pour former le nom d'une variable. Un nom de variable ne peut être constitué que de lettres non-accentuées, de chiffres et du tiret de soulignement ( _
), et le premier caractère ne peut pas être un chiffre. De plus, C est sensible à la casse, c'est-à-dire que les noms CHOCOLAT
, chocolat
et Chocolat
sont trois noms différents.
Enfin, la troisième règle est une règle de bonne pratique. Il est très important de choisir un nom de variable qui décrit la donnée qu'elle va contenir. Par exemple, pour une variable dont le but est de contenir le poids d'une personne, on utilisera weight
, personWeight
ou person_weight
, mais on évitera x
, w
ou the_weight_of_a_person
.
Déclaration et initialisation
Pour pouvoir utiliser une variable dans un programme, il faut avant tout la déclarer. Déclarer une variable, c'est lui choisir un nom et définir son type. Voici par exemple comment déclarer une variable de type int
dont le nom est weight
, qui permet de représenter le poids d'un sachet de chips :
La déclaration d'une variable est donc une instruction qui se compose de deux éléments : on indique d'abord le type de la variable, suivi du nom que l'on veut lui donner. Voyons un autre exemple de déclaration d'une variable sex
de type char
qui permet de représenter le sexe d'une personne ('M'
pour mâle et 'F'
pour femelle) :
La figure 6 montre les deux variables que l'on vient de créer. Remarquez que les valeurs des deux variables ne sont pas connues (?
). En effet, en C, lorsqu'on déclare une variable, on n'a aucune information quant au contenu de la variable. Elle peut contenir tout et n'importe quoi (comme on le verra plus loin, la valeur d'une variable nouvellement déclarée correspond en fait à ce qu'il y avait en mémoire au moment de la déclaration).
Une fois une variable déclarée, il faut l'initialiser avant de pouvoir l'utiliser, c'est-à-dire définir sa valeur initiale. Pour ce faire, on écrit par exemple :
L'initialisation d'une variable comporte donc deux parties : on indique le nom de la variable à initialiser, suivi du caractère =
et suivi de la valeur initiale que l'on veut donner à la variable. La figure 7 montre l'état des deux variables une fois qu'elles ont été initialisées.
Enfin, on peut déclarer et initialiser une variable en une seule opération. Par exemple, pour les deux variables qu'on a utilisées comme exemple, on peut directement écrire :
Modification
Une fois une variable déclarée et initialisée, on peut à tout moment changer sa valeur. La modification de la valeur d'une variable se fait de nouveau avec le =
. En fait, on utilise exactement la même notation que celle utilisée pour l'initialisation. Par exemple, si on veut changer de sexe, on écrit :
La figure 8 montre l'état des deux variables après cette modification. La valeur de la variable sex
a bel et bien changé, tandis que la valeur de la variable weight
est restée inchangée.
Opérateur d'affectation
Le signe =
est en fait l'opérateur d'affectation. Il permet d'affecter, c'est-à-dire donner, une valeur à une variable. Lorsque c'est la première fois qu'on l'utilise, on parle d'initialisation de la variable, et sinon il s'agit d'une modification de la valeur de la variable.
La figure 9 illustre la forme générale d'une instruction d'affectation. Elle commence par le nom de la variable, suivi de l'opérateur =
, suivi de la nouvelle valeur de la variable. L'instruction se termine par un point-virgule.
La valeur peut être un littéral, à savoir une donnée écrite directement dans le code (comme 42
, 7.5
ou 'Z'
), le nom d'une autre variable (dans lequel cas on fait une copie de sa valeur) ou enfin une opération, comme on le verra dans la section suivante. L'exemple ci-dessous déclare et initialise une variable age
à 30 puis fait une copie de cette variable dans une autre variable copy
.
Affichage avec printf
Comme on l'a vu dans l'introduction, il est important pour un programme d'être capable de communiquer avec ses utilisateurs, afin de lui montrer les résultats produits. Pour ce faire, une méthode que l'on peut utiliser consiste à afficher les données calculées à l'écran.
On va utiliser la fonction printf
pour faire cet affichage. Afin de pouvoir utiliser cette fonction, il faut au préalable inclure le fichier stdio.h
. La première chose que l'on peut faire consiste à afficher du texte à l'écran, comme on a déjà pu voir dans le chapitre précédent. Par exemple, on peut afficher un message de bienvenue avec l'instruction suivante :
Après exécution, voici ce qui est affiché à l'écran :
Bonjour, Bienvenue dans ce programme !
On peut observer que la séquence de caractères \n
a été remplacée par un saut de ligne. C'est en effet son rôle. Il s'agit d'une séquence d'échappement, c'est-à-dire une suite de caractères qui sera traitée comme un cas particulier, et qui représente un caractère spécifique (le saut de ligne dans cet exemple).
Sortie formatée
En plus de pouvoir afficher du texte, on va également pouvoir y incruster la valeur de variables. Pour ce faire, on doit insérer des balises et indiquer le nom de la variable dont on veut afficher la valeur. C'est ce qu'on appelle une sortie formatée. Prenons un exemple :
On voit donc qu'on a ajouté la balise %d
, qui signifie qu'une valeur de type int
doit être insérée à la place de la balise. La valeur qu'il faut utiliser est celle de la variable year
comme on l'a également indiqué à la fonction printf
. À chaque type de donnée est associée une balise spécifique. Voici un autre exemple avec la balise %c
pour un caractère :
La figure 10 reprend les balises à utiliser pour les différents types de données qu'on a vus dans cette section. Notez la différence entre les versions signed
et unsigned
pour les types supportant ces deux types.
Type | signed |
unsigned |
---|---|---|
short |
%hd |
%hu |
int |
%d |
%u |
long int |
%ld |
%lu |
long long |
%lld |
%llu |
float |
%f |
|
double |
%f |
|
long double |
%Lf |
|
char |
%c |
|
char |
%hhd |
%hhu |
printf
pour afficher des données.On peut utiliser plusieurs balises dans un même appel à la fonction printf
. Dans ce cas, il faudra évidemment lister toutes les variables dont il faut prendre les valeurs. La figure 11 montre un exemple d'appel à printf
qui utilise trois balises. L'ordre d'apparition des balises doit être le même que l'ordre dans lequel les variables sont listées.
Voici un exemple concret qui utilise une sortie formatée avec plusieurs variables, de différents types :
Formatage avancé
Enfin, il faut savoir qu'il est possible de faire du formatage avancé en utilisant les options des différentes balises. On va s'intéresser aux deux balises %d
et %f
.
Pour la balise %d
, il est possible de préciser le nombre de caractères que l'on souhaite en tout, pour afficher le nombre entier. Si le nombre de caractères dans le nombre à afficher est plus petit que l'option spécifiée pour la balise %d
, des espaces seront ajoutés devant. Prenons un exemple :
Comme on peut le voir sur le résultat de l'exécution montré ci-dessous, les deux premières lignes sont affichées de manière normale. En effet, le nombre affiché fait trois caractères de long, et on demande respectivement un affichage sur 2 et 3 caractères. À la troisième ligne, un espace a été ajouté, et à la quatrième 7 espaces ont été ajoutés pour atteindre les 10 caractères demandés.
valeur = 719 valeur = 719 valeur = 719 valeur = 719
Au lieu de compléter avec des espaces, on peut aussi vouloir compléter avec le chiffre zéro. Pour cela, il suffit de commencer la balise par %0
, suivi du nombre de caractères total, suivi par d
. Voici par exemple comment afficher une heure, et faire en sorte que l'affichage occupe toujours 5 caractères.
Comme on peut le voir sur le résultat d'exécution de ce code, des zéros ont été ajoutés à la deuxième ligne affichée, puisque l'heure et les minutes sont des chiffres qui n'occupent donc qu'un seul caractère.
Il est 11:17 Il est 09:02
Pour la balise %f
, il est possible de spécifier le nombre de chiffres que l'on veut derrière la virgule. Pour cela, on ajoute entre le %
et le f
, le nombre de chiffres qu'on veut, juste après un .
. Voyons un exemple :
La première instruction d'affichage restreint donc à seulement 2 chiffres après la virgule, alors que la deuxième instruction d'affichage demande 6 chiffres après la virgule. L'exécution de ces lignes de code affiche :
pi = 3.14 pi = 3.141593