Operatorpräzedenz: A-- && B++



  • Hallo,

    ich verstehe gerade überhaupt nicht warum mein compiler (gcc) mir
    etwas anderes ausgibt als ich gelernt hab:

    double a = 3.45;
    int b = 0;
    std::cout << (a-- && b++) << std::endl;
    

    liefert mir Null und nicht 1 wie ich erwarten würde. Denn laut den präzedenzregeln ist doch der "++" operator stärker als der "&&". Warum wertet er trotzdem zuerst das && aus und macht erst danach b++ ? Kann mir hier jemand erklären was ich falsch mache?



  • post-increment vs pre-increment



  • ich bezweifle, dass der gcc diesen Code kompilieren kann. Er hat Syntaxfehler.



  • Postinkrement und Preinkrement haben doch höhere priorität als &&.

    gcc wirds nicht akzeptieren. g++ schon. habe das falsche forum gewählt FALLS man sich auf die AUsgabe versteift. eine main fehlt natürlich. es ist pseudocode.... 🙄



  • Uhabo schrieb:

    Postinkrement und Preinkrement haben doch höhere priorität als &&.

    std::cout << (a-- && b++) << std::endl;
    

    ist das gleiche wie

    std::cout << (a && b) << std::endl;
    --a;
    ++b;
    


  • Uhabo schrieb:

    std::cout << (a-- && b++) << std::endl;
    

    ^^ supertux hat recht. was soll das werden? sieht ja völlig verkehrt aus.

    Uhabo schrieb:

    Denn laut den präzedenzregeln ist doch der "++" operator stärker als der "&&". Warum wertet er trotzdem zuerst das && aus und macht erst danach b++ ? Kann mir hier jemand erklären was ich falsch mache?

    naja, post-increment und -decrement schlagen erst zu, nachdem der wert gelesen wurde. für vergessliche ein hilfreicher merksatz:

    C++; // this makes C bigger but returns the old value, *fg*
    

    🙂



  • Uhabo schrieb:

    Denn laut den präzedenzregeln ist doch der "++" operator stärker als der "&&". Warum wertet er trotzdem zuerst das && aus und macht erst danach b++ ? Kann mir hier jemand erklären was ich falsch mache?

    Ich weiß nicht, was du falsch machst, der Compiler macht jedenfalls alles richtig. Er wertet zuerst b++ und dann && aus. Das Ergebnis von b++ ist der aktuelle Wert von b, zusätzlich wird b inkrementiert -- aber erst nachdem das Ergebnis feststeht.

    int b = 0;
    // b == 0
    int a = b++; // a == 0
    // b == 1
    

    Mit der Priorität hat das nichts zu tun, wie du durch explizites Klammernsetzen hättest herausfinden können. Zusätzlich wär die Alternative gar nicht sinnvoll:

    (a-- && b)++
    

    ?


Anmelden zum Antworten