Angenommen, wir haben den Beispielcode in C. Wird er kompiliert? Wie funktionieren die Konzepte von Lvalues und Rvalues in diesem Problem?
#define X 8
int main(void)
{
++X; // will this line compile?
return 0;
}
Das Konzept der lvalues und rvalues muss ein wenig, um den Code oben, und das Problem wird gebeten, um wirklich zu verstehen erklärt. Bevor wir fortfahren, sollten Sie beachten, dass die hier vorgestellte Definition von lvalues und rvalues nicht exakt ist, da selbst die C-Standards in der Definition eher vage sind.
Der Unterschied zwischen rvalues und lvalues
Ein Objekt ist ein Bereich des Speichers, der untersucht werden kann, aber nicht unbedingt modifiziert. Ein Lvalue ist ein Ausdruck, der sich auf ein solches Objekt bezieht. Der Begriff lvalue bezog sich ursprünglich auf Objekte, die auf der linken (also der 'l') Handseite eines Ausdrucks erscheinen. Diese Definition ist nicht mehr gültig, da jeder mit const qualifizierte Typ ebenfalls als L-Wert betrachtet wird. Er kann jedoch niemals auf der linken Seite einer Zuweisungsanweisung stehen, da er nicht geändert werden kann. Daher wurde der Begriff "modifizierbarer L-Wert" erstellt, um auf einen L-Wert Bezug zu nehmen, der modifiziert werden kann, und ein Konst-qualifizierter Typ fällt nicht in diese Kategorie.
Ein rvalue ist ein beliebiger Ausdruck, der einen Wert hat, dem jedoch kein Wert zugewiesen werden kann. Man könnte auch sagen, dass ein R-Wert ein beliebiger Ausdruck ist, der kein L-Wert ist.Ein Beispiel für einen rvalue wäre eine wörtliche Konstante - etwa "8" oder "3.14". Also, der Wert '8' im obigen Code ist eindeutig ein rvalue.
Mit unserem Verständnis von lvalues und rvalues die Frage zu beantworten
Nun wollen wir versuchen, das Problem zu lösen. Streng genommen muss der Operand des Präfix- (oder Postfix-) Inkrementoperators ein modifizierbarer L-Wert sein. Also, was ist der Operand des Präfix-Inkrementoperators in unserem obigen Code?
Da X ein Makro ist, wird die obige Anweisung nach der Ausführung des Präprozessors auf "++ 8" erweitert. Dies bedeutet, dass "8" der Operand des Präfix-Inkrementoperators ist. Und da 8 ein rvalue ist, kann es nicht als Argument für "++" verwendet werden. Dies bedeutet wiederum, dass der obige Code nicht kompiliert wird.
Ich glaube, Ihr letzter Satz hat es rückwärts –