Zum Inhalt springen

L-Wert (Programmierung)

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 17. Mai 2015 um 22:23 Uhr durch Havaniceday (Diskussion | Beiträge) (Beispiele: Ausgabe ergänzt). Sie kann sich erheblich von der aktuellen Version unterscheiden.

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.

Beispiele

// C++ Quellcode
 
#include <iostream>
 
int x;
int& f(int& variable) { return variable; }  // gibt einen 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 ein L-Wert-Ausdruck, 5 ein R-Wert-Ausdruck
 
    // g(x) = 0;    // Funktioniert nicht, da g(x) kein L-Wert-Ausdruck ist!

    std::cout << "Der L-Wert von x ist    " << &x << std::endl;
    std::cout << "Der L-Wert von f(x) ist " << &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 " << &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 " << zeiger+2 << std::endl;
    std::cout << "Der L-Wert von feld[2] ist     " << &(feld[2]) << std::endl;
}

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

Hieran ist ersichtlich, dass die L-Werte die Speicheraddressen sind, auf die die L-Wert-Ausdrücke verweisen.