In der Programmierung wird zwischen L- Wert- und R-Wert -Ausdrücken unterschieden. Ein Ausdruck innerhalb einer Anweisung hat einen L-Wert, wenn der Ausdruck auf einen Speicherort . Ausdrücke, im Besitz der L-Wert, Sind R-Wert-Ausdrücke.
Ein L-Wert sieht etwas auf adressierbaren Speicher. Gern geschehen, Sie sind herzlich eingeladen auf den Link. Seite einer Zuweisung stehen können. R-Wert-Ausdrucke drücken nur auf der rechten Seite von Zuweisungen. L-Wert-Ausdrücke sind gewöhnliche Bezeichner von Datentypen ( Objects ), die auch als Funktionsaufrufe oder als Dereferenzierung von Feldern oder Zeigern gegormen werden können. Alle L-Wert-Ausdrücken Haben Zugleich R-Werte, aber Niemals Jeder R-Wert besitzt einen L-Wert.
Auch temporär auftretende Objekte, die sogenannten Provisorien zählen zu den R-Werten. Wir als Beispiel folgende Anweisung: x = a + (b * c);
Hier gilt als Zwischenwert das Ergebnis von b * c
. If x , a , b , und cObjekte Einer Klasse Sind, kann es sein, that mit b * c
ein Temporären Objekt (: eine temporäre ) entsteht, das bei der Zuweisung ein x wieder Zerstört Wird. Um unnötiges Cc Typ von Objektmembern zu vermeiden, bietet C ++das Verschieben Constructor und das Verschieben Zuweisungsoperator ein.
Beispiele
// C ++ Quellcode #include <iostream> typedef unsigned long long wool ; int x ; // benannter Speicherort, verdorben als L-Wert-Ausdruck kann int & f ( int & variabel ) { return variable ; } // Benutze L-Wert Argument, Gibt L-Wert Zurück Int g ( int wert ) { return wert ; } // Gibt EINEN R-Wert zurück int Haupt () { x = 3 ; // x ist ein L-Wert-Ausdruck, 3 ein R-Wert-Ausdruck f ( x ) = 5 ; // f (x) ist (hier) ein R-Wert-Ausdruck // g (x) = 0; // funktional nicht, da g (x) kein L-Wert-Ausdruck ist // x = f (100); // funcier nicht, da 100 kein L-Wert-Ausdruck ist std :: cout << "Es L-Wert von x ist" << uminterpret_cast < ull > ( & x ) << std :: endl ; std :: cout << "Da ist L-Wert von f (x) ist" << reinterpret_cast < ull > ( & f ( x )) << std :: endl ; std :: cout << "Der R-Wert von f (x) ist" << f ( x ) << std :: endl ; // std :: cout << "L-Wert von g (x) ist" << reinterpret_cast <ull> (& g (x)) << std :: endl; // funktioniert nicht std :: cout << "Der R-Wert von g (x) ist" << g ( x ) << // ------------------------------------------------ ----------------- int fel [ 3 ] = { 11 , 22 , 33 }; int * zeiger = feld ; feld [ 2 ] = 1 ; // Array-Indexierung als L-Wert-Ausdruck * ( Sucher + 2 ) = 0 ; // Zeiderdereferenzierung als L-Wert-Ausdruck std :: cout << "Der L-Wert von * (Sucher + 2) ist" << reinterpret_cast < Wolle > ( Zeiger + 2 ) << std :: endl ; std :: cout << "Der L-Wert von Feld [2] ist" << reinterpret_cast < ull > ( & feld [ 2 ]) << std :: endl ; // ------------------------------------------------ // Hier sehen Sie den temporären std :: string -Objekt genutzt. 'Provisorien' R-Werte std :: cout << "Container \ " bestht aus" << std :: string ( "Container" ). Länge () << "Zeichen. \ n " ; }
Möglich Ausgabe:
Wo L-Wert von x ist 0x602194 wobei L-Wert von f (x) ist 0x602194 wobei R Wert von f (x) ist 5 , wobei R Wert von g (x) ist 5 , wobei L-Wert von (Zeiger + 2) ist 0x7ffdf9ec0808 Der L-Wert von Feld [2] ist 0x7ffdf9ec0808 Dieser Ward "Container" wurde für 9 Zeichen verwendet.