Intanto indenta il codice decentemente, aiuta un sacco. Poi, la parola chiave "reference" non esiste, i reference in C++ si indicano con la &
codice:
{
int x = 1;
int y = 1;
void pippo(int & z)
{
z = x + y + z;
}
{
int y = 3;
{
int x = 3;
}
pippo(y);
write(y);
}
write(y);
}
Poi, la regola di base è facilissima: la variabile che viene presa in considerazione (se ce n'è più di una con lo stesso nome) è quella dichiarata nel blocco più interno (ma non più interno del blocco in cui ci si trova)
codice:
{
int x = 1;
int y = 1;
void pippo(int & z)
{
// gli x e y a cui ci si riferisce qui sono quelli che valgono 1
z = x + y + z;
}
{
int y = 3;
{
// questa variabile muore alla chiusura della graffa, quindi ai nostri fini non ci interessa
int x = 3;
}
pippo(y); // a pippo viene passato un riferimento a y=3
// y ora vale 1 + 1 + 3 = 5 (=> pippo)
write(y); // viene stampato 5
}
write(y); // l'y a cui ci si riferisce ora è quella che vale 1
}