Assegnamento
Il C++ e` un linguaggio pesantemente basato sul paradigma imperativo, questo
vuol dire che un programma C++ e` sostanzialmente una sequenza di assegnamenti
di valori a variabili. E` quindi naturale iniziare parlando proprio dell'assegnamento.
L'operatore di assegnamento e` denotato dal simbolo = (uguale) e viene
applicato con la sintassi:
< lvalue > = < rvalue >;
Il termine lvalue indica una qualsiasi espressione che riferisca
ad una regione di memoria (in generale un identificatore di variabile), mentre
un rvalue e` una qualsiasi espressione la cui valutazione produca
un valore. Ecco alcuni esempi:
Pippo = 5;
Topolino = 'a';
Clarabella = Pippo;
Pippo = Pippo + 7;
Clarabella = 4 + 25;
Il risultato dell'assegnamento e` il valore prodotto dalla valutazione della
parte destra (rvalue) e ha come effetto collaterale l'assegnazione di tale valore
alla regione di memoria denotato dalla parte sinistra (lvalue). Cio` ad esempio
vuol dire che il primo assegnamento sopra produce come risultato il valore 5
e che dopo tale assegnamento la valutazione della variabile Pippo
produrra` tale valore fino a che un nuovo assegnamento non verra` eseguito su
di essa.
Si osservi che una variabile puo` apparire sia a destra che a sinistra di un
assegnamento, se tale occorrenza si trova a destra produce il valore contenuto
nella variabile, se invece si trova a sinistra essa denota la locazione di memoria
cui riferisce. Ancora, poiche` un identificatore di variabile puo` trovarsi
contemporaneamente su ambo i lati di un assegnamento e` necessaria una semantica
non ambigua: come in qualsiasi linguaggio imperativo (Pascal, Basic, ...) la
semantica dell'assegnamento impone che prima si valuti la parte destra e poi
si esegua l'assegnamento del valore prodotto all'operando di sinistra.
Poiche` un assegnamento produce come risultato il valore prodotto dalla valutazione
della parte destra (e` cioe` a sua volta una espressione), e` possibile legare
in cascata piu` assegnamenti:
Clarabella = Pippo = 5;
Essendo l'operatore di assegnamento associativo a destra, l'esempio visto sopra
e` da interpretare come
Clarabella = (Pippo = 5);
cioe` viene prima assegnato 5 alla variabile Pippo e il risultato
di tale assegnamento (il valore 5) viene poi assegnato alla variabile
Clarabella.
Esistono anche altri operatori che hanno come effetto collaterale l'assegnazione
di un valore, la maggior parte di essi sono comunque delle utili abbreviazioni,
eccone alcuni esempi:
Pippo += 5; // equivale a Pippo = Pippo
+ 5;
Pippo -= 10; // equivale a Pippo = Pippo - 10;
Pippo *= 3; // equivale a Pippo = Pippo * 3;
si tratta cioe` di operatori derivanti dalla concatenazione dell'operatore
di assegnamento con un altro operatore binario.
Gli altri operatori che hanno come effetto laterale l'assegnamento sono quelli
di autoincremento e autodecremento, ecco come possono essere utilizzati:
Pippo++; // cioe` Pippo += 1;
++Pippo; // sempre Pippo += 1;
Pippo--; // Pippo -= 1;
--Pippo; // Pippo -= 1;
Questi due operatori possono essere utilizzati sia in forma prefissa (righe
2 e 4) che in forma postfissa (righe 1 e 3); il risultato comunque non e` proprio
identico poiche` la forma postfissa restituisce come risultato il valore della
variabile e poi incrementa tale valore e lo assegna alla variabile, la forma
prefissa invece prima modifica il valore associato alla variabile e poi restituisce
tale valore:
Clarabella = ++Pippo;
/* equivale a */
Pippo++;
Clarabella = Pippo;
/* invece */
Clarabella = Pippo++;
/* equivale a */
Clarabella = Pippo;
Pippo++;
|