Variables et affectationDans le dialogue d’impression, choisissez « Enregistrer au format PDF » comme destination.
Retour

Algorithmique 1 · C1 Notions de base · Chapitre 2 · 20 min

Variables et affectation

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éen

Un 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 ← 8

Aprè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 + 1

Appliquez 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 x=x+1x = x + 1 ; avec elle, elle est limpide.

Quiz · 1 question

Après x ← 5, puis y ← x, puis x ← 8, que vaut y ?

  • 8, car y suit les changements de x
  • 5, car y a reçu une copie de la valeur
  • Rien : y n'a jamais été déclarée

Réponse : y ← x copie la VALEUR de x au moment de l'exécution. Les deux casiers restent indépendants : modifier x ensuite ne touche pas y. Il n'y a aucun lien permanent entre deux variables.

É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.

Animation · 5 étapes

Échanger a et b… sans variable temporaire

  1. a reçoit 5Objectif de l'algorithme : finir avec a = 9 et b = 5.
  2. b reçoit 9État initial en place. Les deux valeurs à échanger sont 5 et 9.
  3. a ← b : le 5 vient d'être écraséL'affectation REMPLACE le contenu du casier. La valeur 5 n'existe plus nulle part, dans aucune variable. Le mal est déjà fait, même si l'erreur ne se verra qu'à l'étape suivante.
  4. b ← a : b reçoit… 9On voulait donner à b l'ancien a. Mais a ne vaut plus 5, il vaut 9. Rien ne bouge à l'écran, et c'est précisément le problème.
  5. Résultat : 9 et 9L'échange a échoué et une donnée a été perdue. On attendait 9 et 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.

Animation · 6 étapes

Échanger a et b avec une variable temporaire

  1. a reçoit 5Même point de départ que la version ratée, avec un casier de plus.
  2. b reçoit 9tmp existe mais ne sert pas encore.
  3. tmp ← a : on met 5 à l'abriC'est toute l'astuce. Avant d'écraser a, on en garde une copie ailleurs. Copier ne vide pas la source : a vaut toujours 5.
  4. a ← b : a devient 9Le 5 de a est écrasé, exactement comme dans la version ratée — mais cette fois il est en sécurité dans tmp.
  5. b ← tmp : b récupère l'ancien atmp était le seul endroit où subsistait le 5. On le rend à b.
  6. Résultat : 9 et 5 — échange réussiTrois affectations, jamais moins. Retenir l'ordre : sauvegarder, écraser, restituer.

Retenez le schéma en trois temps, il resservira au chapitre sur les tris : sauvegarder — écraser — restituer.

tmp ← aa ← bb ← tmp

Trois 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.

Quiz · 1 question

Pourquoi la version sans variable temporaire échoue-t-elle ?

  • Parce qu'il manque une déclaration de variable
  • Parce que la première affectation détruit la valeur dont la seconde a besoin
  • Parce qu'on ne peut pas affecter une variable à une autre variable

Réponse : a ← b écrase le 5 avant que b ait pu le recevoir. La variable temporaire n'est pas une astuce d'écriture : c'est le seul endroit où la valeur menacée peut survivre à l'écrasement.

Quiz · 1 question

Que vaut somme après : somme ← 0 ; somme ← somme + 3 ; somme ← somme + 4 ?

  • 7les deux ajouts cumulés
  • 0l'initialisation seule
  • 34les chiffres mis bout à bout

Réponse : À chaque ligne, on relit le contenu actuel de somme, on ajoute, on range le total. 0 puis 3 puis 7. C'est le mécanisme de l'accumulateur, la brique centrale de la leçon 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.

TypeContientOpérations typiques
entier0, 42, −7+, , ×, division entière, modulo
réel3.14, −0.5+, , ×, /
chaîne"bonjour"concaténation, longueur
booléenVRAI, FAUXET, 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

Exercice de code

Échangez a et b avec une variable temporaire. Sans l'échange simultané de JavaScript.

Point de départ

// É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

Solution

let a = 5;
let b = 9;

// Sauvegarder — écraser — restituer.
const tmp = a;
a = b;
b = tmp;

console.log(a, b); // 9 5

À retenir

Flashcards · 2 cartes

Quelle est la seule façon d'échanger deux variables sans rien perdre ?
Passer par une troisième variable : tmp ← a, puis a ← b, puis b ← tmp. Sauvegarder, écraser, restituer.
Comment se lit x ← x + 1 ?
On évalue la droite avec la valeur actuelle de x, puis on range le résultat dans x. Autrement dit : augmente x de 1.