Cours 1 · Notions de baseLeçon 2 sur 3
Variables et affectation
20 min de lecture5 sections Version PDF
Comprendre l'affectation comme un remplacement, et échanger le contenu de deux variables.
Une variable est un casier nommé dans la mémoire. Le nom sert à le désigner, le casier contient une valeur, et cette valeur peut changer au cours de l'exécution — d'où le nom.
Trois choses à ne jamais confondre : le nom (somme), le contenu (42), et le
type (entier). Le nom ne change jamais. Le contenu change à chaque affectation. Le type
est fixé à la déclaration et engage tout le reste.
Variables age : entier taille : réel nom : chaîne majeur : booléenUn casier peut être vide au départ : déclarer réserve la place, cela ne met rien dedans. Utiliser une variable jamais affectée, c'est lire un casier dont on ne sait pas ce qu'il contient — une des sources d'erreur les plus pénibles à diagnostiquer, parce que le programme ne plante pas forcément, il donne juste un résultat faux.
L'affectation est un remplacement, pas une équation
x ← 5 ne signifie pas « x égale 5 » mais « mets 5 dans x ». La nuance est décisive :
x ← 5x ← 8Après ces deux lignes, x vaut 8. Le 5 n'est plus nulle part. L'affectation écrase :
elle ne cohabite pas avec l'ancienne valeur, elle la détruit. Un casier ne contient qu'une
chose à la fois.
C'est ce qui rend possible une ligne comme celle-ci, qui n'a aucun sens en mathématiques :
x ← x + 1Appliquez la règle de la leçon 1 — la droite d'abord. Si x vaut 7 : on évalue 7 + 1,
ce qui donne 8, puis on range 8 dans x. La ligne se lit « augmente x de 1 ». Sans la règle
de la droite d'abord, elle ressemble à l'équation absurde ; avec elle, elle est
limpide.
Après x ← 5, puis y ← x, puis x ← 8, que vaut y ?
Échanger deux variables
Voici le problème le plus instructif de toute la leçon. On a a = 5 et b = 9, on veut
finir avec a = 9 et b = 5. La solution qui vient naturellement est fausse — et la
raison de son échec est exactement la propriété d'écrasement qu'on vient de voir.
Objectif de l'algorithme : finir avec a = 9 et b = 5.
Regardez bien l'étape 3. Au moment où a ← b s'exécute, la valeur 5 disparaît de la
mémoire. Elle n'est nulle part ailleurs : elle est perdue. L'étape 4 essaie de la rendre à
b, mais elle n'existe plus. On finit avec deux fois 9.
La solution demande un troisième casier, dont le seul rôle est de garder la valeur menacée le temps de l'opération.
Même point de départ que la version ratée, avec un casier de plus.
Retenez le schéma en trois temps, il resservira au chapitre sur les tris : sauvegarder — écraser — restituer.
tmp ← aa ← bb ← tmpTrois affectations, jamais moins, et l'ordre n'est pas négociable : intervertir deux de ces lignes ramène le bug de la version ratée.
Pourquoi la version sans variable temporaire échoue-t-elle ?
Que vaut somme après : somme ← 0 ; somme ← somme + 3 ; somme ← somme + 4 ?
Les types
Le type d'une variable détermine les valeurs qu'elle peut contenir et les opérations qui ont un sens sur elle.
| Type | Contient | Opérations typiques |
|---|---|---|
| entier | 0, 42, −7 | +, −, ×, division entière, modulo |
| réel | 3.14, −0.5 | +, −, ×, / |
| chaîne | "bonjour" | concaténation, longueur |
| booléen | VRAI, FAUX | ET, OU, NON |
Deux pièges valent le détour. D'abord, + ne veut pas dire la même chose partout :
3 + 4 vaut 7, mais "3" + "4" vaut "34" — la même opération sur des chaînes colle les
morceaux bout à bout. Ensuite, la division entière n'est pas la division : 7 / 2 vaut 3.5
en réels, et 7 ÷ 2 vaut 3 en entiers. Cette division entière n'est pas un détail
technique ; c'est elle qui fera fonctionner la recherche dichotomique à la leçon 6.
À vous
Échangez a et b avec une variable temporaire. Sans l'échange simultané de JavaScript.
// Échangez le contenu de a et b. // Interdit : l'écriture [a, b] = [b, a], qui masque justement le mécanisme // qu'on cherche à comprendre. Trois affectations, pas une de moins. let a = 5; let b = 9; // à compléter console.log(a, b); // attendu : 9 5
À retenir
Vous avez parcouru les 5 sections.
Marquez-la terminée pour faire avancer votre parcours, ou revenez sur un point avant de passer à la suite.