Espressioni L-Value e R-Value
Le espressioni che fanno riferimento alle posizioni di memoria vengono chiamate "espressioni l-value". L'espressione l-value rappresenta un valore del "localizzatore" dell'area di archiviazione o un valore "sinistro", pertanto può essere visualizzato a sinistra del segno di uguale (=). Le espressioni L-value sono spesso identificatori.
Le espressioni che fanno riferimento alle posizioni modificabili vengono definite "l-value modificabili". Un'espressione l-value modificabile non può avere un tipo matrice, un tipo incompleto o un tipo con l'attributo const. Affinché le strutture e le unioni siano espressioni l-value modificabili, non devono disporre di alcun membro con l'attributo const. Il nome dell'identificatore indica un percorso di archiviazione, mentre il valore della variabile è il valore archiviato in quella posizione.
Un identificatore è un'espressione l-value modificabile se fa riferimento a una posizione di memoria e se il relativo tipo è aritmetico, struttura, unione o puntatore. Ad esempio, se ptr è un puntatore a un'area di archiviazione, *ptr sarà un'espressione l-value modificabile che definisce l'area di archiviazione a cui punta ptr.
Una qualsiasi delle seguenti espressioni del linguaggio C può essere un'espressione l-value:
Un identificatore di tipo integrale, a virgola mobile, puntatore, struttura o tipo di unione
Un'espressione di indice ([ ]) che non viene valutata in una matrice
Un'espressione di selezione dei membri (–> o .)
Un'espressione unaria di riferimento indiretto (*) che non si riferisce a una matrice
Un'espressione l-value tra parentesi
Un oggetto const (un'espressione l-value non modificabile)
Il termine "r-value" talvolta viene utilizzato per descrivere il valore di un'espressione e per distinguerlo da l-value. Tutti le espressioni l-value sono r-value ma non tutti le espressioni r-value sono I-value.
Sezione specifica Microsoft
Microsoft C include un'estensione allo standard ANSI C che consente di eseguire il cast delle espressioni l-value da utilizzare come l-value, purché la dimensione dell'oggetto venga non allungata tramite il cast. Per ulteriori informazioni, vedere Conversioni del cast di tipo. Nell'esempio seguente viene illustrata questa funzionalità:
char *p ;
short i;
long l;
(long *) p = &l ; /* Legal cast */
(long) i = l ; /* Illegal cast */
Per impostazione predefinita, in Microsoft C le estensioni Microsoft sono abilitate. Utilizzare l'opzione del compilatore /Za per disabilitare queste estensioni.
Fine sezione specifica Microsoft