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


  • Mod

    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 + 2 wü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..


  • Mod

    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 zu i = 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)+2 errechnet wird, da die Argumente evaluiert werden, bevor sie an die Funktion gehen. Genau so ist es auch beim Operator.


Anmelden zum Antworten