Mémoire, variables, pile

Mémoire, variables, pile#

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:

    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.

/// BEGIN SOLUTION

  1. Voir cours

  2. Voir cours

  3. 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:

    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