C99 Assoziativität für Operatoren - wo wird es angegeben?

8

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 Quotient a/b darstellbar ist, muss der Ausdruck (a/b)*b + a%b gleich a 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?

    
paxdiablo 23.02.2012, 06:19
quelle

2 Antworten

9

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:

%Vor%

Also muss ein Parser, der auf a = b = c stößt, ihn wie a = (b = c) parsen, was rechtsassoziativ ist.

    
rob mayoff 23.02.2012, 06:23
quelle
3

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.

    
Avi 23.02.2012 06:27
quelle

Tags und Links