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)++
?