PROGRAMMIAMO
C++ - Variabili locali
Variabili locali

Abbiamo già detto che le variabili dichiarate nel main sono dette variabili locali al main, mentre le variabili dichiarate in una funzioni si dicono variabili locali alla funzione (anche i parametri della funzione fanno parte delle variabili locali alla funzione):

#include <cstdlib>
#include <iostream>

using namespace std;

double eleva(double base, int esp);

int main(int argc, char *argv[])
{
double b,p; // variabili locali al main
int e; // variabile locali al main

cout<<"Inserisci il valore della base: ";
cin>>b;
cout<<"Inserisci il valore dell'esponente: ";
cin>>e;

p = eleva(b,e);

cout<<b<<" elevato a "<<e<<" = "<<p<<"\n";

system("PAUSE");
return EXIT_SUCCESS;
}

double eleva(double base, int esp) // parametri: variabili locali alla funzione
{
double ris=1; // variabile locale alla funzione

while (esp>0)
{
ris = ris * base;
esp--;
}

return ris;
}

In realtà il C++ è ancora più flessibile riguardo alla dichiarazione di variabili. Si osservi per esempio il seguente frammento di programma:

for (int cont=0;cont<10;cont++)
  cout<<cont<<"\n";

In questo caso la variabile cont è dichiarata all'interno del ciclo for che la usa. In generale il C++ consente di dichiarare variabili praticamente all'interno di qualsiasi blocco di programma (dentro if, nei cicli etc.).

Le variabili locali presentano due caratteristiche importanti: la visibilità (in inglese scope) e la durata.

Visibilità

Le variabili locali sono visibili (cioè in pratica utilizzabili) solo all'interno del sottoprogramma che le ha dichiarate. In altre parole, sempre facendo riferimento all'esempio della funzione eleva, solo il main può usare le variabili b, e, p e solo la funzione può usare le variabili base, esp, ris. Se la variabile locale è dichiarata dentro un ciclo (come nell'esempio precedente) la sua visibilità è limitata al ciclo stesso (non può essere usata fuori dal ciclo).

Un tentativo di utilizzare una variabile locale fuori dal sottoprogramma in cui è definita provocherebbe un messaggio di errore del compilatore: var undeclared, variabile non dichiarata, cioè in pratica non esistente.

Se nel main e in una funzione ci sono due variabili locali con lo stesso nome, ciò non causa nessun problema, poiché si tratta in ogni caso di due variabili distinte e diverse (come due persone omonime che però vivono in città diverse). Ognuna delle due variabili omonime rimane visibile solo all'interno del proprio sottoprogramma, non entrando così in conflitto con l'altra.

 

Durata e variabili static

Un'altra caratteristica importante delle variabili locali è il fatto che la loro durata (detta anche tempo di vita o life time) è limitata al sottoprogramma in cui sono state dichiarate.

Per capire meglio questa proprietà, si consideri l'esempio seguente:

// Funzione che (in teoria) dovrebbe contare il numero di chiamate
int conteggio(void)
{
int cont=0;
cont=cont+1;
return cont;
}

L'idea sarebbe quella che la funzione conteggio ad ogni chiamata incrementa il valore della sua variabile locale cont, contando in tal modo il numero delle chiamate.

Il conteggio però non funziona perché cont è una variabile locale alla funzione. Essa pertanto vive solo per il tempo in cui viene eseguita la funzione. Al termine della funzione lo spazio di memoria di cont viene riallocato e riusato per altre variabili e ogni valore eventualmente memorizzato in cont viene così perduto.

In altre parole, nessun valore può essere memorizzato in una variabile locale fra una chiamata e l'altra della funzione che la dichiara. Le uniche variabili locali che hanno una durata illimitata sono quelle dichiarate nel main che durano finché il main rimane in esecuzione (cioè per tutta la durata del programma).

Esiste però un modo in C++ per estendere la durata di una variabile locale e consiste nel dichiararla come statica (static) in questo modo:

// Funzione che conta il numero di chiamate
int conteggio(void)
{
static int cont=0;
cont=cont+1;
return cont;
}

Si osservi la parola chiave static davanti a int: essa indica che la variabile cont dev'essere conservata fra una chiamata e l'altra della funzione e il suo valore non deve essere perso. Con questa piccola modifica la nostra funzione riesce effettivamente a contare il numero di chiamate.

 

link precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it