Visibilità o Scope delle Variabili in Linguaggio C

Lo Scope di una variabile indica il contesto in cui la variabile stessa è visibile. In questa lezione vedremo come il compilatore C gestisce la visibilità delle variabili.

In particolare vedremo la regola generale di visibilità delle variabili.

Regola di visibilità

Nelle precedenti lezioni abbiamo studiato le variabili locali, le variabili globali e i blocchi di codice. In ogni caso abbiamo studiato quali siano le regole di visibilità di una variabile a seconda dei casi.

Adesso proviamo a riassumere in una regola generale come il compilatore gestisce la visibilità delle variabili.

Definizione

Regola di visibilità delle variabili

Quando il compilatore C incontra una variabile, cerca di risolvere il suo nome, ossia di trovare la sua dichiarazione. La ricerca della dichiarazione avviene in base alle seguenti regole:

  1. Se il nome della variabile è lo stesso del nome di una variabile locale, il compilatore utilizza la dichiarazione della variabile locale.
  2. Nel caso in cui non esista una variabile locale con lo stesso nome, il compilatore cerca una variabile locale con lo stesso nome all'interno del blocco di codice più esterno.
  3. Se non esiste una variabile locale con lo stesso nome all'interno del blocco di codice più esterno, il compilatore cerca una variabile globale con lo stesso nome.

Tenendo a mente questa regola generale possiamo comprendere quale sarà il comportamento del compilatore C quando incontrerà una variabile.

Per meglio chiarire il tutto studiamo un esempio.

Esempio riassuntivo

Consideriamo il codice che segue:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* Dichiarazione 1 */
int i = 1;

void f(int i) {     /* Dichiarazione 2 */
    i = 2;
}

void g() {
    int i = 3;      /* Dichiarazione 3 */

    if (i > 0) {
        int i = 4;  /* Dichiarazione 4 */
    }

    i = 5;
}

void h() {
    i = 6;          /* Dichiarazione 5 */
}

L'esempio di sopra, anche se un po' estremo, ci permette di comprendere a fondo la regola di visibilità delle variabili.

Andiamo per ordine:

  1. La variabile i dichiarata alla riga 2 è una variabile globale.
  2. La variabile i dichiarata all'interno della funzione f alla riga 4 è un parametro e pertanto è una variabile locale. Avendo lo stesso nome della variabile globale, essa oscurerà la variabile globale all'interno del corpo della funzione f.
  3. La variabile i dichiarata all'interno della funzione g alla riga 9 è una variabile locale. All'interno del corpo di g essa oscurerà la variabile globale i.
  4. La variabile i dichiarata all'interno del blocco if alla riga 12 è una variabile locale del blocco if. All'interno del corpo del blocco if essa oscurerà la variabile locale i dichiarata all'interno della funzione g.
  5. La variabile i usata nella riga 15 è riconducibile alla variabile i dichiarata all'interno della funzione g alla riga 9.
  6. La variabile i usata nella riga 19 è riconducibile alla variabile globale i dichiarata alla riga 2 in quanto non esiste nessuna variabile locale con lo stesso nome.

In Sintesi

In sintesi, la regola di visibilità delle variabili ci dice che:

  1. Se il nome di una variabile è lo stesso del nome di una variabile locale, il compilatore utilizza la dichiarazione della variabile locale.
  2. Se il nome di una variabile non è lo stesso del nome di una variabile locale, il compilatore cerca una variabile locale con lo stesso nome all'interno del blocco di codice più esterno.
  3. Se non esiste una variabile locale con lo stesso nome all'interno del blocco di codice più esterno, il compilatore cerca una variabile globale con lo stesso nome.

A questo punto abbiamo chiaro i concetti di visibilità o scope delle variabili e la loro durata di vita. Nella prossima lezione analizzeremo un concetto importante che lega lo scope all'esecuzione delle funzioni: le Funzioni Pure e le Funzioni Impure.