Articolo originale: Variable Scope in C – Local and Global Scope Explained

Nella programmazione, dovrai spesso avere a che fare con l'ambito di una variabile. L'ambito di una variabile determina se è possibile o meno accedervi e modificarla all'interno di un blocco specifico di codice.

In questo tutorial, imparerai l'ambito di una variabile nel linguaggio di programmazione C. Vedrai alcuni esempi di codice per aiutarti a comprendere le differenze tra variabili locali e globali.

Cos'è l'ambito di una variabile?

Prima di proseguire per conoscere l'ambito locale e globale di una variabile, capiamo cosa significa ambito.

In termini semplici, l'ambito di una variabile è il suo tempo di vita nel programma.

Questo vuol dire che l'ambito di una variabile è il blocco di codice all'interno dell'intero programma dove la variabile è stata dichiarata, usata e può essere modificata.

Nella sezione successiva, imparerai cos'è l'ambito locale delle variabili.

Ambito Locale delle Variabili in C – Blocchi Annidati

In questa sezione, imparerai come funzionano le variabili locali in C. Prima scriveremo del codice per un paio di esempi, quindi generalizzeremo il principio di ambito.

▶ Ecco il primo esempio:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        //aggiunge 10 a my_num
        my_num = my_num +10;
        //oppure più brevemente my_num +=10
        printf("my_num è %d",my_num);
    }
    
    return 0;
}

Cerchiamo di capire cosa fa il programma qui sopra:

In C, un blocco di codice è delimitato da parentesi graffe: {}. Le parentesi graffe di apertura e chiusura indicano rispettivamente l'inizio e la fine di un blocco.

  • La funzione main() ha una variabile di tipo intero my_num che viene inizializzata con il valore 7 nel blocco più esterno.
  • C'è un blocco più interno che cerca di aggiungere 10 alla variabile my_num.

Ora, compilando ed eseguendo il programma qui sopra, si ottiene il risultato:

//Output

my_num è 17

Puoi notare quanto segue:

  • Il blocco più interno è in grado di accedere al valore di my_num che è stato dichiarato nel blocco più esterno e modificarlo aggiungendo 7 al valore contenuto.
  • Il valore di my_num ora è 17, come indicato nel risultato.

Ambito Locale delle Variabili in C – Blocchi Annidati Esempio 2

▶ Ecco un altro esempio sull'argomento:

#include <stdio.h>

int main() 
{
    int my_num = 7;
    {
        int new_num = 10;
    } 
    printf("new_num è %d",new_num); //questa è la riga 9
    return 0;
}
  • In questo programma, la funzione main() ha una variabile di tipo intero my_num nel blocco più esterno.
  • Un'altra variabile, new_num viene inizializzata nel blocco più interno, che è annidato nel blocco più esterno.
  • Stiamo cercando di accedere e stampare il valore della variabile del blocco più interno new_num dal blocco più esterno.

Se cerchi di compilare il codice qui sopra, noterai che la compilazione non va a buon fine, e otterrai il seguente errore, il cui messaggio tradotto è "errore: 'new_num' non dichiarata, (usata per la prima volta in questa funzione)":

Line   Message
9      error: 'new_num' undeclared (first use in this function)
Questo perché la variabile new_num è stata dichiarata nel blocco più interno e il suo ambito è limitato al suddetto blocco. In altre parole, è locale rispetto al blocco più interno e non può essere utilizzata nel blocco più esterno.

In base alle osservazioni qui sopra, scriviamo il seguente principio generico per l'ambito locale delle variabili:

{
    /BLOCCO PIU' ESTERNO/
    
      {
        
        
        //Il contenuto del blocco più esterno che si trova immediatamente prima dell'inizio di questo blocco
        //è ACCESSIBILE qui
        
        /BLOCCO PIU' INTERNO/
        
        
      }
     
       //Il contenuto del blocco più interno NON è accessibile qui
 }

Ambito Locale delle Variabili in C – Blocchi Diversi

Nell'esempio precedente, hai imparato che l'accesso da un blocco più esterno alle variabili annidate in un blocco più interno non è consentito.

In questa sezione, imparerai circa l'ambito locale di variabili dichiarate in blocchi diversi.

#include <stdio.h>

int main()
{
    int my_num = 7;
    printf("%d",my_num);
    my_func();
    return 0;
}

void my_func()
{
    printf("%d",my_num);
}

Nell'esempio qui sopra:

  • La variabile di tipo intero my_num è dichiarata all'interno della funzione main().
  • All'interno della funzione main(), il valore di my_num viene stampato.
  • C'è un'altra funzione, my_func(), che cerca di accedere e stampare il valore di my_num.
  • Quando inizia l'esecuzione del programma con la funzione main(), c'è una chiamata a my_func() all'interno della funzione main().

▶ Ora compila ed esegui il programma qui sopra. Otterrai il messaggio di errore qui sotto (traduzione: "errore 'my_num' non dichiarata (primo uso in questa funzione)):

Line   Message
13     error: 'my_num' undeclared (first use in this function)

Se noti, nella riga 13, la funzione my_func() tenta di accedere alla variabile my_num che è stata dichiarata e inizializzata all'interno della funzione main().

Pertanto l'ambito della variabile my_num è confinato alla funzione main(), e si dice che è locale alla funzione main().

Possiamo rappresentare genericamente questa nozione di ambito locale come segue:

{

    /BLOCCO 1/
    // da qui non si può accedere al contenuto del BLOCCO 2
    
}


{

    /BLOCCO 2/
    // da qui non si può accedere al contenuto del BLOCCO 1
    
} 

Ambito Globale delle Variabili in C

Finora, hai imparato a conoscere l'ambito locale delle variabili C. In questa sezione imparerai come dichiarare variabili globali in C.

▶ Iniziamo con un esempio.

#include <stdio.h>
int my_num = 7;

int main()
{
    printf("si può accedere a my_num da main() e il suo valore è %d\n",my_num);
    //chiama my_func
    my_func();
    return 0;
}

void my_func()
{
  printf("si può accedere a my_num anche da my_func() e il suo valore è %d\n",my_num);
} 

Nell'esempio qui sopra:

  • La variabile my_num è dichiarata al di fuori delle funzioni main() e my_func().
  • Cerchiamo di accedere a my_num all'interno della funzione main() e ne stampiamo il valore.
  • Chiamiamo la funzione my_func() all'interno della funzione main().
  • La funzione my_func() cerca anche di accedere al valore di my_num per stamparlo.

Questo programma si compila senza errori e il risultato è mostrato qui sotto:

//Output
si può accedere a my_num da main() e il suo valore è 7
si può accedere a my_num anche da my_func() e il suo valore è 7

In questo esempio, ci sono due funzioni  –  main() e my_func().

Tuttavia la variabile my_num non è locale ad alcuna funzione nel programma. Una variabile di questo tipo, non locale ad alcuna funzione, ma si dice che ha un ambito globale e viene chiamata variabile globale.

Questo principio di ambito globale delle variabili può essere riepilogato come segue:

//tutte le variabili globali sono dichiarate qui
function1()
    {
    
    // è possibile accedere a tutte le variabili globali dall'interno di function1
    
    }
function2()
    {
    
    // è possibile accedere a tutte le variabili globali dall'interno di function2
     
    } 

In questo tutorial, hai imparato la differenza tra ambito locale e globale. Questo è un tutorial di livello introduttivo sull'ambito delle variabili in C.

In C, esistono modificatori di accesso per controllare il livello di accessibilità di cui una variabile dispone. Puoi modificare la modalità di accesso usando le parole chiave corrispondenti quando dichiari le variabili.

Ci vediamo al prossimo tutorial. Fino ad allora, buona programmazione!