Variabili passate come parametri
Il programma
Locali.java
chiarisce un punto che può risultare poco chiaro
nella programmazione con procedure e funzioni.
/*
Esempio sull'uso di variabili locali.
*/
class Locali {
static void uno(int x) {
x=x+1;
}
static int due(int x) {
x=x+1;
return x;
}
public static void main(String[] args) {
int x=5;
int y;
uno(x);
System.out.println(x);
y=due(x);
System.out.println(x);
System.out.println(y);
}
}
Ci poniamo il seguente problema: cosa viene stampato?
Questo non è difficile, se si seguono esattamente
le regole sul passaggio dei parametri che sono state
specificate fino ad ora. A volte però vengono date
risposte errate, del tipo ``viene stampato per tre volte
il numero 6'', oppure ``viene stampato 5, poi due volte 6''.
La risposta esatta è:
viene stampato due volte 5, poi una volta 6
Se il risultato che ci si aspettava è diverso, allora
non si sono seguite correttamente le regole di passaggio
sulle procedure.
Analizziamo quindi l'esecuzione del programma:
- viene creata la variabile x e ci viene messo 5;
- si crea la variabile y;
- si chiama la procedura uno, passando il valore di
x (che in questo caso è 5);
- la procedura uno crea una sua variabile
che chiama x, e in questa variabile ci mette il valore
passato, cioè 5; è importante notare che questa
variabile, anche se ha lo stesso nome, non è la stessa
di quella che sta nel programma;
- la variabile x interna alla procedura uno
viene incrementata;
- questo termina l'esecuzione di uno;
- si esegue System.out.println(x); fino a questo punto,
la variabile x non è stata modificata: infatti,
la procedura uno ha modificato la sua variabile x,
che non è la stessa del programma. Quindi, si stampa il
valore 5.
La chiamata alla funzione due è simile: la
variabile x che viene incrementata è una
variabile locale della funzione, e non è la stessa
del programma. La funzione due permette di vedere come
l'unico modo che una funzione ha di influenzare il
programma è quello di ritornare dei valori: tutte le
altre modifiche vengono ignorate dal programma. In questo
caso, la variabile x interna alla funzione viene
modificata, ma questa modifica non si riflette sulla variabile
x del programma, ma soltanto nel fatto che il valore
che la procedura rimanda al programma (che è il valore
di x aumentato di 1) viene memorizzato nella
variabile y.