klammerung



  • kann mir jemand erklären warum :
    x = -4 * i++ – 6 % 4;

    so geklammert wird:
    x = ( ((-4) * (i++)) – (6 % 4) )

    ich hätte angefangen i++ zu klammern weil es den höchsten vorrang hat, dann * / % von rechts nach links, weil es den nächst höchsten hat dann - weil niedrigeren vorrang aber es verwirrt mich einfach ..



  • Das unaere '-' hat hoehere Prioritaet als das binary '*'.

    Zum Beispiel:Bei '-1' ist es ein unaeres Minus. Bei '1 - 2' ist es ein binaeres Minus.

    Siehe hier die Operator Precedence Tabelle.



  • aber es verwirrt mich einfach ..

    Was verwirrt dich? Erklär doch was du nicht verstehst, dann kann man wenigstens eine Frage beantworten.



  • ich verstehe nicht welche klammern hier jetzt zuerst gerechnet werden ... ich habe keine ahnung wie ich das einklammern solte...



  • Fragä schrieb:

    ich verstehe nicht welche klammern hier jetzt zuerst gerechnet werden

    Das ist eine tolle Frage, die man leider nicht beantworten kann, da der C++ Standard die Auswertungsreihenfolge nicht definiert. Ergo bedeutet das, dass die Operator Precedence nichts mit der Auswertungsreihenfolge zu tun hat. Die Operator Precedence sagt nur, welche Operanden ein Operator an sich bindet.

    Bsp:

    -4 * i++ – 6 % 4
    
    1. ++ Postfix hat die höchste Priorität (bzgl. deines Beispiels):
    • 4 * (i++) – 6%4
    1. - unary minus hat die zweithöchste Priorität:
      (-4) * (i++) – 6%4

    2. * und % haben die dritthöchste Priorität:
      ((-4) * (i++)) – (6%4)

    3. - subtraction hat die vierthöchste Priorität:
      ( ((-4) * (i++)) – (6%4) )

    So: Wie gesagt, ist die Auswertungsreihenfolge nicht definiert. D.h., ob nun zuerst ((-4) * (i++)) oder (6%4) gerechnet wird... man kann es nicht sagen, es ist undefiniert.



  • postfix vor präfix
    präfix vor binären operatoren
    binäres "punkt" (mal, durch) vor binärem "strich" (plus, minus)

    das mit den präzedenzen steuert aber nur die klammerung, also, WAS gerechnet wird, und nicht in welcher Reihenfolge die Teilausdrücke ausgewertet werden. Natürlich bedingt das eine ein bisschen das andere, aber es gibt noch genug Freiheiten. Bei (a+b)*(c+d) kann entweder zuerst a+b oder c+d ausgerechnet werden. Du verstehst..?


Anmelden zum Antworten