Mémoire, variables, pile#
Exercice
Sortez une feuille
Cours: écrivez la sémantique de la déclaration de variables
Cours: écrivez la sémantique de la déallocation de variables
Lisez attentivement le code suivant:
int x = 1; cout << "1: " << x << endl; // Affiche x { int y = 10; x = x + y; cout << "2: " << x << " " << y << endl; // Affiche x et y { int x = 5; x = x + 1; cout << "3: " << x << " " << y << endl; // Affiche x et y } x = x + 1; cout << "4: " << x << " " << y << endl; // Affiche x et y } cout << "5: " << x << " " << y << endl; // Affiche x et y cout << "6: " << x << endl; // Affiche x
Exécutez le code pas à pas en dessinant la pile juste avant chaque affichage. Si une ligne est incorrecte, supprimez là.
Déduisez-en ce qui est affiché.
Vérifiez en exécutant le code dans une nouvelle cellule ci-dessous.
/// BEGIN SOLUTION
Voir cours
Voir cours
Exécution pas à pas
On suppose que le code est placé dans un
main()avec les directives nécessaires. Voici l'état de la pile et les affichages :Initialisation :
int x = 1;La variable x est allouée au somet de la la pile:
┌──────────┬─────┐ │ int x │ 1 │ └──────────┴─────┘ Pile👉 Affichage:
1Entrée dans le bloc 1 et calcul :
int y = 10;puisx = x + y;┌──────────┬─────┐ │ int y │ 10 │ │ int x │ 11 │ └──────────┴─────┘ Pile👉 Affichage:
11 10Entrée dans le bloc 2 (Masquage) :
int x = 5;puisx = x + 1;Une nouvelle variable x est allouée au sommet de la pile, masquant la précédente:
┌──────────┬─────┐ │ int x │ 6 │ <--- Variable locale au bloc 2 │ int y │ 10 │ │ int x │ 11 │ <--- Variable masquée └──────────┴─────┘ Pile👉 Affichage:
6 10Sortie du bloc 2
La variable
xau sommet de la pile est désallouée:┌──────────┬─────┐ │ int y │ 10 │ │ int x │ 11 │ └──────────┴─────┘ PileReprise dans le bloc 1 :
x = x + 1;┌──────────┬─────┐ │ int y │ 10 │ │ int x │ 12 │ └──────────┴─────┘ Pile👉 Affichage 4 :
12 10Sortie du bloc 1
La variable
yest désallouée:La ligne :
cout << "5: " << x << " " << y << endl;est incorrecte. La variableya été déclarée à l'intérieur du premier bloc{ }. Elle est désallouée dès que l'exécution sort de ce bloc. Elle est donc inaccessible pour l'affichage final.┌──────────┬─────┐ │ int x │ 12 │ └──────────┴─────┘ Pile👉 Affichage 4 :
12
Pour résumer, après suppression de la ligne erronée, le programme affiche:
1: 1 2: 11 10 3: 6 10 4: 12 10 6: 12
/// END SOLUTION
#include <iostream>
using namespace std;
/// BEGIN SOLUTION
int x = 1;
cout << "1: " << x << endl; // Affiche x
{
int y = 10;
x = x + y;
cout << "2: " << x << " " << y << endl; // Affiche x et y
{
int x = 5;
x = x + 1;
cout << "3: " << x << " " << y << endl; // Affiche x et y
}
x = x + 1;
cout << "4: " << x << " " << y << endl; // Affiche x et y
}
cout << "6: " << x << endl; // Affiche x
/// END SOLUTION
1: 1
2: 11 10
3: 6 10
4: 12 10
6: 12
@0x78c3a747b5a0
type: std::ostream