Im C99-Standard erlauben die Ausdrücke Vorrang und Assoziativität.
Die Rangfolge ist ziemlich gut dokumentiert, da die Reihenfolge, in der die Operatoren im Dokument erscheinen, die Rangfolge verringert, so dass Funktionsaufrufe vor multiplikativen Operatoren stehen, die wiederum vor additive Operatoren stehen.
Ich kann jedoch keine definitive Beschreibung der Assoziativität finden, ob sie links oder rechts ist. Dies ist wichtig, da 35/5*2
für eine Variante 14
und (35/5)*2
für die andere Variante 3
35/(5*2)
wäre.
Abschnitt 6.5 Expressions /3, footnote 74
state:
Die Syntax gibt den Vorrang von Operatoren bei der Auswertung eines Ausdrucks an, der der Reihenfolge der wichtigsten Unterklauseln dieser Unterklausel mit der höchsten Priorität entspricht.
Innerhalb jeder größeren Unterklausel haben die Operatoren die gleiche Priorität. Links- oder Rechts-Assoziativität wird in jeder Unterklausel durch die Syntax für die darin diskutierten Ausdrücke angegeben.
Nehmen wir jedoch den multiplikativen Fall, zum Beispiel:
6.5.5 Multiplikative Operatoren
Syntax
multiplicative-expression:
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression / cast-expression
multiplicative-expression % cast-expression
Einschränkungen
Jeder der Operanden soll einen arithmetischen Typ haben. Die Operanden des Operators%
müssen haben Integer-Typ Semantik
Die üblichen arithmetischen Umwandlungen werden an den Operanden durchgeführt Das Ergebnis des binären*
-Operators ist das Produkt der Operanden.
Das Ergebnis des/
Operators ist der Quotient aus der Division des ersten Operanden durch den zweite; Das Ergebnis des%
-Operators ist der Rest. In beiden Operationen, wenn der Wert von der zweite Operand ist Null, das Verhalten ist nicht definiert Wenn ganze Zahlen geteilt sind, ist das Ergebnis des/
-Operators der algebraische Quotient mit einem beliebigen Bruchteil verworfen. Wenn der Quotienta/b
darstellbar ist, muss der Ausdruck(a/b)*b + a%b
gleicha
sein.
Ich kann dort nichts sehen, was die Assoziativität erwähnt, und es scheint auch keine Standardeinstellungen an anderer Stelle im Standard zu geben.
Fehle ich hier etwas?
Operator-Assoziativität wird nicht explizit als "rechts-assoziativ" oder "links-assoziativ" angegeben. Sie leiten es von der Grammatik ab. In Ihrem Beispiel bezieht sich der Ausdruck multiplicative-expression
rekursiv auf sich selbst und die Rekursion auf der linken Seite des Operators. Das bedeutet, dass ein Parser, der auf a * b * c
trifft, a * b * c
wie (a * b) * c
parsen muss, was linksassoziativ ist.
Der assignment-expression
-Term (6.5.16) hat diese Grammatik:
Also muss ein Parser, der auf a = b = c
stößt, ihn wie a = (b = c)
parsen, was rechtsassoziativ ist.
Die Grammatik selbst spezifiziert die Assoziativität durch die verwendeten Produktionen:
%Vor% Dies bedeutet, dass in a * b * c
, c
als cast-expression
und a * b
als 1 multiplicative-expression
analysiert werden muss, bevor das a * b
selbst weiter analysiert wird. Daher wird die Links-Assoziativität der Multiplikation durch die Parser-Regeln in den Syntax-Baum gezwungen.
Tags und Links c iso associativity