Supponiamo di avere il codice di esempio mostrato di seguito in C. Compilerà? Come funzionano i concetti di lvalue e rvalues in questo problema?
#define X 8
int main(void)
{
++X; // will this line compile?
return 0;
}
Il concetto di lvalue e rvalues deve essere spiegato un po 'per capire davvero il codice di cui sopra, e il problema viene chiesto. Prima di procedere, è necessario notare che la definizione di lvalues e rvalues qui presentati non è esatta, in quanto anche gli standard C stessi sono piuttosto vaghi sulla definizione.
La differenza tra rvalues e lvalue
Un oggetto è una regione di memoria che può essere esaminato, ma non necessariamente modificato. Un lvalue è un'espressione che si riferisce a un tale oggetto. Il termine lvalue si riferiva originariamente agli oggetti che appaiono a sinistra (da cui il lato "l") di un'espressione. Quella definizione non si applica più poiché qualsiasi tipo const-qualified è considerato anche un lvalue, ma non può mai apparire sul lato sinistro di un'istruzione di assegnazione perché non può essere modificato. Quindi, il termine "lvalue modificabile" è stato creato per fare riferimento a un lvalue che può essere modificato e un tipo const-qualificato non rientra in questa categoria.
Un rvalue è qualsiasi espressione che ha un valore, ma non può avere un valore assegnato ad esso. Si potrebbe anche dire che un rvalue è qualsiasi espressione che non sia un lvalue.Un esempio di un valore di rvalore sarebbe una costante letterale - qualcosa come "8" o "3,14". Quindi, chiaramente il valore '8' nel codice sopra è un valore.
Utilizzando la nostra comprensione di lvalue e rvalues per rispondere alla domanda
Ora proviamo a risolvere il problema. A rigor di termini, l'operando dell'operatore di incremento prefisso (o suffisso) deve essere un lvalue modificabile. Quindi, qual è l'operando dell'operatore di incremento del prefisso nel nostro codice sopra?
Poiché X è una macro, l'istruzione sopra verrà estesa a "++ 8" dopo l'esecuzione del preprocessore. Ciò significa che "8" è l'operando dell'operatore di incremento del prefisso. E poiché 8 è un valore non può essere usato come argomento per "++". Questo, a sua volta, significa che il codice sopra non verrà compilato.
Credo che la tua ultima frase abbia arretrato –