L-Wert (Programmierung)

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Die fraglichen Angaben werden daher möglicherweise demnächst entfernt. Bitte hilf der Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst.

In der Programmierung wird innerhalb von Anweisungen zwischen L-Wert- und R-Wert-Ausdrücken unterschieden. Ein Ausdruck innerhalb einer Anweisung besitzt einen L-Wert, wenn der Ausdruck auf einen Speicherort verweist. Ausdrücke, die keinen L-Wert besitzen, sind R-Wert-Ausdrücke.

Ein L-Wert zeigt somit auf adressierbaren Speicher. Das L bedeutet, dass ein L-Wert-Ausdruck auf der linken Seite einer Zuweisung stehen kann. R-Wert-Ausdrücke dürfen nur auf der rechten Seite von Zuweisungen vorkommen. L-Wert-Ausdrücke sind häufig Bezeichner von Datentypen (Objekten), können jedoch auch als Funktionsaufrufe oder als Dereferenzierung von Feldern oder Zeigern vorkommen. Alle L-Wert-Ausdrücke haben zugleich R-Werte, aber nicht jeder R-Wert besitzt einen L-Wert.

Auch temporär auftretende Objekte, sogenannte Temporaries zählen zu den R-Werten. Betrachten wir als Beispiel folgende Anweisung: x = a + (b * c); Hier entsteht als Zwischenwert das Ergebnis von b * c. Wenn x, a, b, und c Objekte einer Klasse sind, kann es sein, dass mit b * c ein temporäres Objekt (en: a temporary) entsteht, das bei der Zuweisung an x wieder zerstört wird. Um unnötiges Kopieren von Objektmembern zu vermeiden, bietet C++ den Move Constructor und den Move Assignment Operator an.

Beispiele[Bearbeiten | Quelltext bearbeiten]

// C++ Quellcode

#include <iostream>

typedef unsigned long long ull;

int x;  // benannter Speicherort, der als L-Wert-Ausdruck verwendet werden kann
int& f(int& variable) { return variable; }  // benötigt L-Wert-Argument, gibt L-Wert zurück
int  g(int wert) { return wert; }    // gibt einen R-Wert zurück

int main()
{
    x = 3;       // x ist ein L-Wert-Ausdruck, 3 ein R-Wert-Ausdruck
    f(x) = 5;    // f(x) ist (hier) ein L-Wert-Ausdruck, 5 ein R-Wert-Ausdruck

    // g(x) = 0;    // funktioniert nicht, da g(x) kein L-Wert-Ausdruck ist
    // x = f(100);  // funktioniert nicht, da 100 kein L-Wert-Ausdruck ist

    std::cout << "Der L-Wert von x ist    " << reinterpret_cast<ull>(&x) << std::endl;
    std::cout << "Der 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 << "Der 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) << std::endl;

// -----------------------------------------------------------------

    int feld[3] = { 11, 22, 33 };
    int * zeiger = feld;

    feld[2] = 1;      // Arrayindexierung als L-Wert-Ausdruck
    *(zeiger+2) = 0;  // Zeigerdereferenzierung als L-Wert-Ausdruck

    std::cout << "Der L-Wert von *(zeiger+2) ist " << reinterpret_cast<ull>(zeiger+2) << std::endl;
    std::cout << "Der L-Wert von feld[2] ist     " << reinterpret_cast<ull>(&feld[2]) << std::endl;
//------------------------------------------------
    // Hier wird ein temporaeres std::string -Objekt benutzt. 'Temporaries' besitzen R-Werte
    std::cout << "Das Wort \"Container\" besteht aus " << std::string("Container").length() << " Zeichen.\n";
}

Mögliche Ausgabe:

Der L-Wert von x ist    0x602194
Der L-Wert von f(x) ist 0x602194
Der R-Wert von f(x) ist 5
Der R-Wert von g(x) ist 5
Der L-Wert von *(zeiger+2) ist 0x7ffdf9ec0808
Der L-Wert von feld[2] ist     0x7ffdf9ec0808
Das Wort "Container" besteht aus 9 Zeichen.

Anhand der Ausgabe ist ersichtlich, dass die L-Werte die Speicheradressen der L-Wert-Ausdrücke sind.

Weblinks[Bearbeiten | Quelltext bearbeiten]