Aller au contenu
Topos Uranos

Résumé

Un programme impératif ne calcule pas son résultat d’un seul coup : il le construit par étapes, en conservant des valeurs intermédiaires et en les modifiant. Cette leçon étudie le lieu où elles sont conservées, la variable, qui est une case mémoire dotée d’un nom, d’un type et d’une valeur. Elle enseigne à la déclarer et à l’initialiser avec des accolades, et pourquoi les accolades sont la forme préférée ; à changer sa valeur par affectation, dont le signe = ne signifie pas ce qu’il signifie en mathématiques ; à suivre l’état d’un programme, c’est-à-dire la valeur de toutes ses variables à chaque instant, avec un tableau de suivi ; à choisir des noms qui disent ce que la variable contient, et à éviter l’erreur la plus silencieuse de cette étape : lire une variable à laquelle on n’a jamais donné de valeur, ce qui en C++ est un comportement indéfini.

Objectifs d’apprentissage

  1. Déclarer et initialiser des variables avec des accolades, et distinguer l’initialisation de l’affectation dans un programme donné.
  2. Suivre à la main l’état d’un programme d’affectations successives avec un tableau de suivi, et prédire ainsi sa sortie.
  3. Choisir des noms en anglais qui disent ce que chaque variable contient, selon les règles du langage et le guide du cours.
  4. Expliquer pourquoi lire une variable non initialisée est un comportement indéfini, le reconnaître dans un programme et le prévenir en initialisant toujours.

La variable comme case

Dans la leçon Du problème à l’algorithme, les algorithmes ont été écrits avec des lettres comme qq et rr, qui prenaient une valeur puis une autre : « rr prend la valeur r−br - b ». En mathématiques, une lettre désigne une valeur fixe, quoique inconnue ; dans un algorithme, en revanche, elle désigne un lieu dont le contenu change. Un programme C++ a besoin de la même chose, et il l’obtient de la mémoire de l’ordinateur.

La mémoire principale est une longue suite d’octets, chacun avec son numéro d’ordre, son adresse. Une variable est un morceau de cette mémoire auquel le programme donne un nom et un type. Elle a donc quatre attributs :

  1. un nom, par lequel le programme la désigne (count, price) ;
  2. un type, qui fixe quelles valeurs elle peut contenir, combien d’octets elle occupe et quelles opérations elle admet : int contient des nombres entiers, double des nombres avec décimales ;
  3. une valeur, celle qu’elle contient à un instant donné, qui peut changer pendant que le programme s’exécute ;
  4. un emplacement en mémoire, que le compilateur et le système choisissent et que le programme n’a presque jamais besoin de connaître.

L’image qu’il convient de retenir est celle d’une case : le nom écrit au-dessus, la valeur à l’intérieur. Le type est la taille et la forme de la case ; une case de int n’accepte pas 2.5, comme un casier à lettres n’accepte pas un colis. Les figures de cette leçon dessinent ainsi l’état d’un programme, et le redessinent après chaque instruction.

Que le type fixe la taille, on peut le voir : l’opérateur sizeof donne le nombre d’octets qu’occupe une variable ou un type.

Programme en C++
#include <print>​int main(){    const int count{12};    const double price{4.5};    std::println("count occupe {} octets", sizeof(count));    std::println("price occupe {} octets", sizeof(price));}
Sortie
count occupe 4 octetsprice occupe 8 octets

Un int occupe ici 4 octets, et un double, 8. Ces chiffres ne sont pas les mêmes sur tous les systèmes, et c’est d’eux que dépend le nombre de valeurs distinctes que peut contenir chaque type ; les leçons Les entiers et leur représentation et Les nombres à virgule flottante l’étudieront. Ici, l’essentiel suffit : le type d’une variable est fixé lorsqu’on la déclare et ne change jamais ; ce qui change, c’est sa valeur.