Lvalue e Rvalue 🇬🇧

Note a cura di Antonino Furnari - antonino.furnari@unict.it
Università di Catania, Dipartimento di Matematica e Informatica
Note disponibili qui: http://www.antoninofurnari.github.iohttps://antoninofurnari.github.io/lecture-notes/it/programmazione-c/rvalue-lvalue/
🔝

In C, esistono due tipi di entità, lvalue e rvalue, che entrano in gioco nelle operazioni di assegnamento. Questi termini appaiono a volte nei messaggi di errore dati dal compilatore, per cui è utile comprenderli. Vediamoli nelle prossime sezioni.

Lvalue

Lvalue sta per “left value” (poiché può trovarsi a sinistra dell’operatore di assegnamento) ed è una entità che ha una locazione di memoria ben definita:

  • In ogni operazioni di assegnamento, un lvalue deve possedere la capacità di memorizzare il risultato dell’operazione;
  • Non possono essere lvalue espressioni (es. x + y o constanti letterali (es. 3).

Esempi:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int x;

x = 1; // x è un valido l-value, possiamo scrivere in x

int y = x + 1; // anche y è un valido l-value
// nell'espressione sopra, x appare a destra dell'operatore
// ciò è possibile perché gli r-value possono apparire
// anche a destra degli operatori. 

5 = x; // non consentito, 5 non è un lvalue (non possiamo modificarne il valore!)

Rvalue

Un rvalue è una entità che non è associata a una ben definita locazione di memoria.

  • Qualsiasi cosa che possa restituire una espressione costante o un valore è un lvalue;
  • Espressioni del tipo x + y sono lvalue.

Esempi:

1
2
3
4
5
6
7
8
9
int x = 1;
int y = 0;

x + y = 2; // restituisce un errore, l'espressione
// x + y non è un valido lvalue

// sia f una funzione che restituisce un valore intero
f(0) = 9; // restituisce un errore, f ritorna un valore
// che non può essere modificato. Questo sarà più chiaro quando vedremo le funzioni