Operatorassoziativität

Operatorassoziativität bezeichnet vor allem in der Informatik, aber auch Mathematik und Logik:

  1. im engeren Sinn die Eigenschaft eines Operators *, dass die Reihenfolge, mit der mehrere Vorkommnisse des Operators in einem Ausdruck ausgewertet werden, keinen Einfluss auf das Endergebnis hat, für diesen Operator also das Assoziativgesetz {\displaystyle (a*b)*c=a*(b*c)} gilt;
  2. im weiteren Sinn die Festlegung, auf welche Weise ein nicht im engeren Sinn assoziativer Operator ausgewertet werden soll.

Zum Beispiel sind in der Mathematik die Addition und normale Multiplikation im engeren Sinn assoziative Operatoren, also (a+b)+c=a+(b+c) bzw. (a\cdot b)\cdot c=a\cdot (b\cdot c), ebenso die Matrixmultiplikation und in der Logik die Konjunktion (\land ) und Disjunktion (\lor ).

Bei nicht im engeren Sinn assoziativen Operatoren dagegen hängt das Ergebnis von der per Konvention festgelegten Operatorassoziativität im weiteren Sinn ab: Um zu vermeiden, dass Ausdrücke mit nebeneinander stehenden, gleichwertigen Operatoren ohne Klammerung mehrdeutig sind, wird dabei festgelegt, ob die betreffenden Operatoren von links nach rechts oder umgekehrt von rechts nach links auszuwerten sind.

Linksassoziative Operatoren

Ein linksassoziativer Operator wird von links nach rechts ausgewertet – ein binärer Operator * gilt somit als linksassoziativ, wenn die Ausdrücke

{\displaystyle a*b*c} {\displaystyle :=(a*b)*c}
{\displaystyle a*b*c*d} {\displaystyle :={\bigl (}(a*b)*c{\bigr )}*d}
etc.

wie gezeigt auszuwerten sind. Beispiele für linksassoziative Operationen sind:

{\displaystyle a-b-c} {\displaystyle =(a-b)-c}
{\displaystyle a:b:c} {\displaystyle =(a:b):c}
  {\displaystyle a\div b\div c} {\displaystyle =(a\div b)\div c}
  {\displaystyle a/b/c} {\displaystyle =(a/b)/c}
      Jedoch: Bei waagerechten Bruchstrichen bindet der kürzere Bruchstrich stärker:
  {\displaystyle {\frac {a}{\frac {b}{c}}}} {\displaystyle ={\frac {a}{{\bigl (}{\frac {b}{c}}{\bigr )}}}={\frac {a\cdot c}{b}}}
  {\displaystyle {\frac {\frac {a}{b}}{c}}} {\displaystyle ={\frac {{\bigl (}{\frac {a}{b}}{\bigr )}}{c}}={\frac {a}{b\cdot c}}}

Rechtsassoziative Operatoren

Umgekehrt wird ein rechtsassoziativer Operator * von rechts nach links ausgewertet, so dass gilt:

{\displaystyle x*y*z} := {\displaystyle x*(y*z)}
{\displaystyle w*x*y*z} := {\displaystyle w*(x*(y*z))}
etc.

Beispiele für rechtsassoziative Operationen sind:

Nebenwirkungen in Programmiersprachen

In Programmiersprachen, die Nebenwirkungen in Ausdrücken erlauben, ist die Reihenfolge, in der diese Nebenwirkungen ausgeführt/wirksam werden, von Bedeutung. Einige Programmiersprachen legen diese Auswertungsreihenfolge strikt fest, andere (wie z.B. C oder C++) lassen die Auswertungsreihenfolge bei den meisten Infix-Operanden undefiniert. Beispiel:

int f1(void);
int f2(void);
int f3(void);
int g(int);

int h(void) {
  return g( f1() - f2() - f3() );
}
Es ist nicht definiert, ob zuerst f1, f2 oder f3 ausgeführt werden (und damit ihre Nebenwirkungen wirksam werden).

Siehe auch

Trenner
Basierend auf einem Artikel in: Wikipedia.de
Seitenende
Seite zurück
©  biancahoegel.de
Datum der letzten Änderung: Jena, den: 02.02. 2021