Warum funktioniert



  • der Code

    int i=1;
    int* p=&++i;
    

    und der hier

    int i=1;
    int* p=&i++; // das lehrbuch meint: x++ ist kein lvalue (es ist nicht der in x gespeicherte wert)
    

    nicht? Ich hab' lang darüber nachgedacht, kann mir aber immer noch nicht vorstellen, warum sich das zweite Beispiel so extrem vom ersten unterscheidet, dass es zu einem Compilerfehler kommt.

    Jetzt kann ich nur noch annehmen, dass es am operator(int) liegt, der ein temporäres int zurück gibt und der Compiler so mit einem Fehlermeldung a la kein lvalue meckert - obwohl die Fehlermeldung eher eine Warnung sein sollte und dazu noch anders formuliert.

    int* p=&i++;
    

    Logisch formuliert: Hier wird nur die Adresse von i an p zugewiesen, dann wird der wert von i inkrementiert. 😕
    Technisch formuliert: ++ bindet mehr als &. Deshalb erhält der zeiger p nur ein temporäres Objekt.

    Wo irre ich mich nun 😕



  • IMO:

    Im ersten Code erhöhst du i um 1, anschließend holst du dir die Adresse von i.
    Im zweiten Code holst du dir die Adresse von 'i++', was natürlich nicht gehen kann, da i++ kein gültiger lvalue ist.

    Du hast also schon Recht mit deiner Theorie.



  • Wenn ich richtig aufgepasst habe, ist ein lvalue etwas, das eindeutig existenten Speicherbereich referenziert. Lvalue ist also etwas mit einer eindeutig existenten Adresse.

    Wenn meine Theorie (die technische) zutrifft, so muss bei solch einer Funktion:

    int* f() {
        int i;
        return &i;
    }
    

    ebenfalls bei einer zuweisung wie

    int* p=f();
    

    die Fehlermeldung 'operand kein lvalue' oder so auftreten.
    Stattdessen - ich zitiere - sagt Compiler: "warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben"

    Diese Fehlermeldung passt definitiv auch zur Codezeile

    int* p=&i++;
    

    wenn denn meine Theorie nun stimmt.



  • Stattdessen - ich zitiere - sagt Compiler: "warning C4172: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben"

    Das heisst, dass in der Funktion eine lokale Variable angelegt wurde, für die solange Speicher bereit steht, wie sie existiert. Du gibts praktisch eine Adresse zurück, die ungültig ist, da die Variable beim Verlassen der Funktion zerstört wird.



  • Ich hab' zwar keine konkrete Frage gestellt - die Bedeutung dieser selbstredenden Fehlermeldung wollte ich aber nicht wissen. 😉

    Irgendwas ist in meinem obigen Beitrag ist falsch.



  • die Bedeutung dieser selbstredenden Fehlermeldung wollte ich aber nicht wissen.

    Du glaubst gar nicht, was hier manchmal für Fragen gestellt werden. 😉



  • lvalue schrieb:

    Wo irre ich mich nun 😕

    Keine Ahnung was du meinst.

    Du hast doh schon selber die Antwort gegeben.

    ++x ist ein lvalue
    x++ ist keiner

    Wie war nochmal die Frage?

    Die Fehlermeldung vom Compiler ist übrigens vollkommen richtig - es darf keine Warnung sein, weil du von einem rvalue keine non const Referenz nehmen darfst.


Anmelden zum Antworten