---
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: C++17
  language: C++17
  name: xcpp17
learning:
  objectives:
    apply: [modèle mémoire simple]
  prerequisites:
    understand: [variable]
---

+++

# Mémoire, variables, pile

+++ {"tags": ["locked"]}

:::{admonition} Exercice
1. Sortez une feuille
2. Cours: écrivez la sémantique de la déclaration de variables
3. Cours: écrivez la sémantique de la déallocation de variables
4. Lisez attentivement le code suivant:
   ```c++
   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
   ```
5. Exécutez le code pas à pas en dessinant la pile juste avant chaque affichage.
   Si une ligne est incorrecte, supprimez là.
6. Déduisez-en ce qui est affiché.
7. Vérifiez en exécutant le code dans une nouvelle cellule ci-dessous.
:::

+++ {"tags": ["answer"]}

/// BEGIN SOLUTION

2. Voir cours
3. Voir cours
4. 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 :

   1. **Initialisation :** `int x = 1;`

      La variable x est allouée au somet de la la pile:

      ```
      ┌──────────┬─────┐
      │    int x │  1  │
      └──────────┴─────┘
             Pile
      ```

      👉 **Affichage:** `1`

   2. **Entrée dans le bloc 1 et calcul :** `int y = 10;` puis `x = x + y;`

      ```
      ┌──────────┬─────┐
      │    int y │ 10  │
      │    int x │ 11  │
      └──────────┴─────┘
             Pile
      ```

      👉 **Affichage:** `11 10`

   3. **Entrée dans le bloc 2 (Masquage) :** `int x = 5;` puis `x = 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 10`

   4. **Sortie du bloc 2**

      La variable `x` au sommet de la pile est désallouée:

      ```
      ┌──────────┬─────┐
      │    int y │ 10  │
      │    int x │ 11  │
      └──────────┴─────┘
             Pile
      ```

   5. **Reprise dans le bloc 1 :** `x = x + 1;`

      ```
      ┌──────────┬─────┐
      │    int y │ 10  │
      │    int x │ 12  │
      └──────────┴─────┘
             Pile
      ```

      👉 **Affichage 4 :** `12 10`

   6. **Sortie du bloc 1**

      La variable `y` est désallouée:

      La ligne : `cout << "5: " << x << " " << y << endl;` est incorrecte. La variable
      `y` a é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`

4. Pour résumer, après suppression de la ligne erronée, le programme affiche:

   ```text
   1: 1
   2: 11 10
   3: 6 10
   4: 12 10
   6: 12
   ```

/// END SOLUTION

```{code-cell}
:tags: ["answer"]

#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
```
