Operatorassoziativität

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

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

  1. im engeren Sinn die Eigenschaft eines Operators, dass die Reihenfolge, mit der mehrere Vorkommnisse dieses Operators in einem Ausdruck ausgewertet werden, keinen Einfluss auf das Ergebnis der Auswertung hat, das heißt, dass für ihn das Assoziativgesetz (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 Multiplikation assoziative Operatoren, weil (a+b)+c=a+(b+c) und (a \cdot b)\cdot c=a \cdot (b \cdot c) ist. In der Logik sind zum Beispiel Konjunktion und Disjunktion assoziativ, weil einerseits (a \and b) \and c und a \and (b \and c) und andererseits (a \or b) \or c und a \or (b \or c) äquivalent sind. Nicht assoziativ sind zum Beispiel Division und Konditional, weil im Allgemeinen (a:b):c \neq a:(b:c) ist und weil (P \rightarrow Q) \rightarrow R und P \rightarrow (Q \rightarrow R) nicht äquivalent sind.

Erst bei nicht assoziativen Verknüpfungen hängt das Ergebnis von der Operatorassoziativität ab. Um zu vermeiden, dass Ausdrücke mit nebeneinander stehenden, gleichwertigen Operatoren ohne Klammerung mehrdeutig sind, wird eine Assoziativität per Konvention festgelegt:

  • Ein Linksassoziativer Operator wird von links nach rechts ausgewertet.
    • Ein Beispiel ist die Subtraktion: Es ist a-b-c = (a-b)-c.
    • Auch die Division ist linksassoziativ: a:b:c = (a:b):c
    • Das Konditional in der Logik wird von den meisten Autoren linksassoziativ verwendet, das heißt dass P \rightarrow Q \rightarrow R als (P \rightarrow Q) \rightarrow R zu lesen ist.
  • Ein Rechtsassoziativer Operator wird von rechts nach links ausgewertet. Beispiele hierfür:
    • Die Potenzierung in der Mathematik: a^{b^c} = a^{(b^c)}
    • Der Zuweisungsoperator verschiedener Programmiersprachen wie beispielsweise C:
      a = b = c ist gleichbedeutend mit a = (b = c), das heißt der Variablen b wird zunächst der Wert von c zugewiesen und das Ergebnis dieser Zuweisung (das gleich dem zugewiesenen Wert ist) anschließend a zugewiesen.

In Programmiersprachen, die Seiteneffekte in Ausdrücken erlauben, ist die Reihenfolge, in der diese Seiteneffekte 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 Seiteneffekte wirksam werden). Dagegen ist festgeschrieben, dass g erst aufgerufen wird, nachdem f1, f2 und f3 (mit ihren Seiteneffekten) beendet sind. Das Argument von g ist identisch zu (f1()-f2()) - f3().

Siehe auch[Bearbeiten]