Vorrang von operatoren
-
Guten tag,
In meinem Buch steht:Beispiele:
1. i += 3; ist äquivalent zu i = i + 3;
2. i *= j + 2; ist äquivalent zu i = i * (j+2);
Das zweite Beispiel zeigt, dass bei einer zusammengesetzten Zuweisung implizit
geklammert wird. Dies ergibt sich aus der Tatsache, dass der Vorrang der zusammengesetzten
Zuweisung ebenso niedrig ist wie bei der einfachen Zuweisung.Beispiel 1 vollkommen verständlich, Beispiel 2 nicht.
ich denke mir das ja erst multipliziert wird und dann addiert, weil punkt vor strich, ich verstehe nicht warum dort geklammert wird..
vielleicht kann mir das jemand anders formulieren
-
Na, ist halt einfach so und du hast unrecht. Anders wäre es auch nicht sehr sinnvoll:
Hypothetisches Szenario, wie du es beschreibst:
i *= j + 2 ist äquivalent zu (i = i * j) + 2
Das heißt, das+ 2würde gar nichts mehr an i verändern!Deswegen sind die ganzen Zuweisungsoperatoren von der Priorität her so niedrig. Man will schließlich, dass das auf der rechten Seite erst ausgerechnet wird, bevor es auf das auf der linken Seite wirkt.
-
Danke, ich sollte vielleicht manchmal nicht alles hinterfragen..
-
Fragözeichen schrieb:
Danke, ich sollte vielleicht manchmal nicht alles hinterfragen..
Doch, das ist eigentlich eine sehr gute Einstellung. Du hast nun hoffentlich etwas gelernt aus deiner Frage.
-
Dass
i *= aäquivalent ist zui = i * a, bedeutet nicht, dass der Compiler da tatsächlich eine Textersetzung o.ä. durchführt und dann eventuell die Operatoren anders klammert. Stell dir den Operator als Funktionsaufruf vor:int mul_eq(int& i, int a) { return (i = i * a); }Hier erwartest du ja auch nicht, dass bei
mul_eq(i, j+2)eigentlich(i*j)+2errechnet wird, da die Argumente evaluiert werden, bevor sie an die Funktion gehen. Genau so ist es auch beim Operator.