Operator-Präzeden
-
Hallo,
ich wäre sehr froh, wenn mir jemand einen Tipp geben könnte, wo im Folgenden mein Fehler liegt.
int a = 42; int b; b = - ++a / 7; cout << b << endl; // - 41/7Wenn ich den Ausdruck in Linie(3) nach den Präzedenzen klammere, dann ergibt sich doch:
(- (++a)) / 7
Vorzeichen und Pre-Inkrement haben die selbe Präzedenz, die Assoziativität ist von links nach rechts, also gilt
(1.) Vorzeichen a => -a d.h a== -42
(2.) Inkrement ++a d.h. a== -41
(3.) Division d.h. b == -41/6Mein Compiler gibt liefert mir jedoch die Zahl -6. Ich gehe also davon aus, dass zuerst das Inkrement von a gebildet wird, bevor das Vorzeichen angefügt wird.
Kann mir bitte jemand einen Tipp geben, warum dies so ist.
Vielen Dank für alle Antworten schon jetzt
Eine gute Woche
Magalie
-
Magalie schrieb:
Mein Compiler gibt liefert mir jedoch die Zahl -6. Ich gehe also davon aus, dass zuerst das Inkrement von a gebildet wird, bevor das Vorzeichen angefügt wird.
Die Antwort hast Du doch schon selbst gegeben:
(- (++a)) / 7
-
Hallo SG1,
vielen Dank für deine Antwort. Ich weiss, das ist jetzt vermutlich eine sehr blöde Frage aber-
ich dachte, ich muss den Ausdruck bei gleicher Präzedenz gemäss der Assoziativität lesen.
Das heisst in diesem Falle müsste ich den Ausdruck von links nach rechts lesen.Darum zuerst das Vorzeichen, dann der Inkrement Operator.
Ich bin da wohl noch etwas verwirrt.
Magalie
-
Hier stehts doch: von rechts nach links.
-
Assoziativität macht bei einstelligen Operatoren überhaupt keinen Sinn. Ich weiß nicht, warum diese Tabellenschreiber da immer irgendwas hinschreiben müssen. Das verwirrt die Leute offensichtlich nur. op1 op2 x heißt *immer* op1 (op2 x), anders geht es nicht.
Assoziativität bedeutet, wie Ketten von zweistelligen Operatoren interpretiert werden. Beispiel:
x + y - z bedeutet (x + y) - z (nicht x + (y - z)), links wird zuerst zusammengefasst, d.h. Linksassoziativität.
x = y = 42 bedeutet x = (y = 42), nicht (x = y) = 42 (zum Glück), Rechtsassoziativität.