2016-03-21 16 views
1

Die Präfixoperatoren geben das Objekt selbst als lvalue zurück. Die Postfix-Operatoren geben eine Kopie des ursprünglichen Werts des Objekts als Rvalue zurück.Wie wird ein Rval dereferenziert?

so in einer Aussage wie so *a++ a inkrementiert wird, und eine Kopie des ursprünglichen Wertes von a wird als R-Wert, sondern von der Microsoft C++ Sprachreferenz auf Lvalues ​​und Rvalues ​​zurück

rvalue ist ein temporärer Wert, der

nicht über den Ausdruck bestehen, die es verwendet und gibt ein Beispiel

// lvalues_and_rvalues1.cpp 
// compile with: /EHsc 
#include <iostream> 
using namespace std; 
int main() 
{ 
    int x = 3 + 4; 
    cout << x << endl; 
} 

In diesem Beispiel ist x ein Lvalue, da es über den Ausdruck hinaus besteht, der es definiert. Der Ausdruck 3 + 4 ist ein R-Wert, weil er einen temporären Wert darstellt, der nicht über den Ausdruck hinaus existiert, der ihn definiert.

Meine Fragen:
1) Was ist der R-Wert aus den *a++ zurückgegeben werden, so dass es dereferenziert werden?
2) Habe ich irgendein Konzept missverstanden?
Vielen Dank im Voraus!

+1

Ihr erstes Zitat ist falsch, z.B. '+ x' ist ein rvalue. Vielleicht spricht es nur von den Operatoren '++' und '-'. –

+0

@ M.M ich glaube nicht, es ist genau was Primer C++ sagt –

+1

Das zweite Zitat ist auch falsch: * Rvalue * ist eine Ausdruckskategorie, kein Wert. (Etwas verwirrende Benennung). '3 + 4' ist ein R-Wert, aber das dritte Zitat sollte sagen" es bleibt nicht über den Ausdruck hinaus, weil es ein temporärer Wert ist ", und nicht umgekehrt. –

Antwort

2

Die Präfixoperatoren geben das Objekt selbst als Lvalue zurück. Die Postfix-Operatoren geben eine Kopie des ursprünglichen Werts des Objekts als R-Wert zurück.

Falsch! Nun, meistens. Wenn das Zitat über alle Präfix/Suffix-Operatoren spricht, dann ist es vollständig erratet. Wenn es jedoch um die ++ und --10 Präfix/Postfix-Paare geht, dann ist es richtig.

Nun, das unter Berücksichtigung ...

was ist der R-Wert von der Rückkehr * A ++, so dass es dereferenziert werden kann?

a Angenommen ist ein Zeiger von einer Art, a++ Inkrementen a und ergibt einen R-Wert, bestehend aus a ‚s-Wert vor dem Inkrement. Die Inkrement- und Dekrementoperatoren, ++ und --, sowohl in Postfix- als auch in Präfixformen, erfordern einen Lvalue als ihren Operator. Dies liegt daran, dass rvalues ​​temporär sind, das heißt, ihr Gültigkeitsbereich ist durch den Ausdruck begrenzt, in dem sie vorkommen, sodass diese Operatoren für sie wenig oder keinen Sinn ergeben.Denken Sie daran, diese Operatoren nicht nur inspizieren/ lesen, aber Änderung/Schreiben auf die Variable selbst.

Der unäre Operator * nimmt ein Zeigerobjekt (-ähnliches Objekt) und deneferenziert es, wodurch ein Lvalue gefunden wird. Es funktioniert für beide Zeiger rvalue und lvalue. Dies liegt daran, dass * als eine Art "passiver" Operator betrachtet werden kann. Es ändert sich nicht ändern/Schreiben Sie auf den Zeiger selbst, aber dereferenziert es und gibt das Lvalue-Objekt an der Adresse zurück, die vom Zeiger gespeichert wird, dessen Adresse natürlich vom Zeiger enthalten ist. Da alles, was * benötigt, die Speicheradresse ist, die in einem Zeigerobjekt enthalten ist, und die Adresse des Zeigers selbst, wenn sie überhaupt eine hat, ist hier nutzlos, * macht sowohl für rvalues ​​als auch für lvalues ​​Sinn.

können Sie denken, dass * „ein R-Wert erfordert“, und dass „lvalues ​​als rvalues ​​bei Bedarf verwendet werden“, wenn sie mehr (oder verwirrt?) Dinge ein wenig verdeutlicht.

+0

gibt, so dass der Wert a vor dem Inkrement ist ein Speicherort so Solange '*' eine Speicherstelle hat, entweder lvalue (Objekt mit Speicherplatz) oder rvalue (Ausdruck, der kein Objekt repräsentiert, das einen identifizierbaren Ort im Speicher belegt.) kann dereferenziert werden, um den in der Adresse –

+0

@ gespeicherten Wert zu erhalten. Psraganvesh: Genau. – 3442

+0

Danke für deine Zeit! –

0

*a++ entspricht:

auto temp = *a; 
a++; 
// Use the value of temp here 

außer Sie nur einmal auf den Wert beziehen, wo als temp Sie mehrere Male verweisen konnte.

+0

Nun, das ist wahr, aber ich denke nicht, dass es die Frage von OP adressiert (was zu sein scheint: Warum kann '*' auf einen R-Wert angewendet werden). –

+0

Wahr. 'a' könnte ein Zeiger sein, oder es könnte ein Objekt einer Klasse sein, die' operator * 'überlädt. Aber wenn die Frage lautet "Warum kann' * 'auf' a ++ '?" Angewendet werden, muss die Antwort lauten "Weil' * 'auf' a' angewendet werden könnte. " – AJNeufeld

+0

@JamesRoot Nr.Der postfix '++' Operator inkrementiert den Wert von 'a' __after__ es wurde benutzt. Hier wird es mit dem Operator "*" dereferenziert. Die Reihenfolge ist also "* a", dann "a ++". – AJNeufeld