Was ist Assoziativität von Operatoren und warum ist sie wichtig?


85

Was ist Assoziativität (für einen Operator) und warum ist sie wichtig?

Aktualisiert: Operatorassoziativität


2
Was für eine Assoziativität? Operatorassoziativität?
Ikke

26
@Neil Butterworth - Das ist ein besonders harter Kommentar für eine vernünftige Frage. Der springende Punkt der Site ist es, ein zentrales Repository für ALLE Programmierkenntnisse zu sein, einschließlich der Dinge, die in Einführungstexten behandelt werden. Was Ihren Kommentar zu @Jian Lins Beantwortung seines eigenen Kommentars betrifft, so ist dies ebenfalls akzeptabel, wie in der ersten Frage der offiziellen FAQ dargelegt. Jemand mit Ihrer Wiederholungsstufe sollte es besser wissen. Wenn Sie damit nicht einverstanden sind, seien Sie zumindest höflich.
Rob Allen

1
@ Rob Allen Siehe seine anderen Beiträge. Außerdem habe ich nicht gesagt, dass er seinen eigenen Beitrag nicht beantworten sollte, nur dass er nicht hilfreich war. Und ich mache dir einen Deal - ich werde dir nicht sagen, wie du deine Beiträge hier formulieren sollst, wenn du mir nicht sagst, wie ich meine formulieren soll.

Antworten:


104

Assoziativität bedeutet für Operatoren, dass, wenn derselbe Operator in einer Reihe erscheint, zuerst das Auftreten des Operators angewendet wird. Im Folgenden sei Qder Operator

a Q b Q c

Wenn Qes assoziativ bleibt, wird es als ausgewertet

(a Q b) Q c

Und wenn es richtig assoziativ ist, dann bewertet es als

a Q (b Q c)

Es ist wichtig, da es die Bedeutung eines Ausdrucks ändert. Betrachten Sie den Divisionsoperator mit ganzzahliger Arithmetik, die assoziativ bleibt

4 / 2 / 3    <=>    (4 / 2) / 3    <=> 2 / 3     = 0

Wenn es richtig assoziativ wäre, würde es zu einem undefinierten Ausdruck ausgewertet, da Sie durch Null teilen würden

4 / 2 / 3    <=>    4 / (2 / 3)    <=> 4 / 0     = undefined

Wissen Sie, wie Sie Assoziativität finden können, ob sie für ein bestimmtes Grammatik links oder rechts ist?
user2510115

1
Zum Beispiel expr -> expr + term;ist links assoziativ und expr -> term + exprist rechts assoziativ.
Subin Sebastian

15
In der ersten Zeile Ihrer Antwort ist es angemessener, anstelle von "wenn derselbe Operator angezeigt wird" zu sagen, "wenn Operatoren mit derselben Priorität angezeigt werden". Beispiel: a * b / c => wobei * und / dieselbe Priorität haben.
10.

2
@ 1O1 danke, aber was passiert, wenn diese Operatoren mit derselben Priorität unterschiedliche Assoziativität haben? Wie würde a * b / cbewertet, ob *linksassoziativ, aber rechtsassoziativ /wäre? Dann gibt es einen Widerspruch. Ich denke also, man muss sagen "wenn Operatoren mit der gleichen Priorität und Assoziativität", wenn Sie mehrere Operatoren abdecken möchten.
Johannes Schaub - litb

2
@ Mark Ich weiß nicht, aber ich kann nicht darüber nachdenken, wie es funktionieren soll. Wahrscheinlich eine zusätzliche Stackoverflow-Frage wert
Johannes Schaub - litb

13

Es gibt drei Arten von Assoziativität:

Die assoziative Eigenschaft in der Mathematik

Reihenfolge der Operationen in Programmiersprachen

Assoziativität in CPU-Caches.

Die assoziative Eigenschaft in der Mathematik ist eine Eigenschaft von Operatoren wie Addition (+). Mit dieser Eigenschaft können Sie Klammern neu anordnen, ohne den Wert einer Anweisung zu ändern.

(a + b) + c = a + (b + c)

In Programmiersprachen ist die Assoziativität (oder Fixität) eines Operators eine Eigenschaft, die bestimmt, wie Operatoren mit derselben Priorität ohne Klammern gruppiert werden . dh in welcher Reihenfolge jeder Bediener ausgewertet wird. Dies kann zwischen den Programmiersprachen unterschiedlich sein.

In CPU-Caches ist Assoziativität eine Methode zur Leistungsoptimierung.


3
Die Assoziativität (oder Fixität) eines Operators ist eine Eigenschaft, die bestimmt, wie Operatoren mit derselben Priorität ohne Klammern gruppiert werden - dieser Satz war einfach perfekt, um mich verständlich zu machen
Rafael Eyng

7

Einfach!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

Wir wissen, dass *, / und% dieselbe Priorität haben, aber gemäß der Assoziativität kann sich die Antwort ändern:

Zum Beispiel: Wir haben Ausdruck: 4 * 8/2% 5

Left associative:   (4 * 8) / 2 % 5 ==> (32 / 2) % 5 ==> 16 % 5 ==> 1

Right associative:  4 * 8 /(2 % 5) ==>  4 * ( 8 / 2) ==> 4 * 4 ==> 16

2
Es scheint einen Fehler in der Antwort zu geben: 2 % 5bewertet zu 2, nicht 0.
6005

5

Wenn Sie sich auf "Operatorassoziativität" beziehen, bestimmt eine Sprache, wie Operatoren mit derselben Priorität ohne Klammern gruppiert werden.

Beispielsweise haben die Operatoren + und - in C-basierten Sprachen dieselbe Priorität. Wenn Sie einen Ausdruck schreiben, der beide verwendet (ohne Klammern), muss der Compiler bestimmen, in welcher Reihenfolge sie ausgewertet werden sollen.

Wenn Sie 12 - 5 + 3 schreiben, umfassen die möglichen Bewertungen:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

Abhängig von der Reihenfolge, in der Sie den Ausdruck auswerten, können Sie unterschiedliche Ergebnisse erzielen. In C-basierten Sprachen haben + und - Assoziativität hinterlassen, was bedeutet, dass der obige Ausdruck als erster Fall ausgewertet wird.

Alle Sprachen haben stark definierte Regeln für Vorrang und Assoziativität. Weitere Informationen zu den Regeln für C # finden Sie hier. Die allgemeinen Konzepte der Operator Assoziativität und Vorrang sind gut auf wikipedia abgedeckt.


Ihre Beispiele wären klarer, wenn sie alle dieselben Operanden verwenden würden.
Michael Carman

Was würde passieren, wenn zwei Operatoren mit derselben Priorität in einem Ausdruck ohne Klammern erscheinen würden, aber einer von ihnen die Assoziativität verlassen hätte und der andere die rechte? Würde es nur die Assoziativität des Operators verwenden, den es zuerst findet?
Hector

es kann nicht passieren, da dieselbe Priorität dieselbe Assoziativität bedeutet. Wenn dies nicht der Fall wäre, könnten es Unklarheiten sein, die die Existenz der Realität bedrohen.
Ankur S

5

Dies ist die Bewertungsreihenfolge für Operatoren mit derselben Priorität. Die Reihenfolge LINKS NACH RECHTS oder RECHTS NACH LINKS ist wichtig. Zum

3 - 2 - 1

Wenn es von links nach rechts ist, dann ist es

(3 - 2) - 1

und ist 0. Wenn es RECHTS nach LINKS ist, dann ist es

3 - (2 - 1)

und es ist 2. In den meisten Sprachen sagen wir, dass der Minusoperator eine Assoziativität von LINKS NACH RECHTS hat.

Update 2020:

Die Situation 3 - 2 - 1mag trivial erscheinen, wenn die Behauptung lautet: "Natürlich machen wir das von links nach rechts". In anderen Fällen, z. B. in Ruby oder NodeJS:

$ irb
2.6.3 :001 > 2 ** 3 ** 2
 => 512 

Der **ist "zur Macht von" Betreiber. Die Assoziativität ist von rechts nach links. Und es ist

 2 ** (3 ** 2)

das heißt 2 ** 9, dh 512statt

(2 ** 3) ** 2

das heißt 8 ** 2, dh 64.


4
Wenn Sie die Antwort bereits kannten, warum haben Sie dann die Frage gestellt?
Robert Harvey

6
es sollte neuen Menschen helfen. Ich erinnere mich, dass ich vor langer Zeit C gelernt habe und wusste erst später, was Assoziativität wirklich ist.
Unpolarität

3
Ich vermute, dass die meisten Leute, die C lernen, auf Ihre "Hilfe" verzichten können.

1
hm ist beispielsweise die Assoziativität auf denselben Operator beschränkt oder auf Operatoren mit derselben Prioritätsebene? Können viele Leute das sicher beantworten, ohne Bücher oder Referenzen zu überprüfen?
Unpolarität

13
@ Neil Butterworth, warum so feindlich? Ich denke, es ist akzeptabel, eine Antwort auf Ihre eigene Frage zu posten. Dies steht in den FAQ und wurde im Podcast mehrmals erwähnt.
Jay Conrod

3

Ich nehme an, Sie meinen Operatorassoziativität ...

Es ist die Reihenfolge der Bindung von Operanden an einen Operator. Grundsätzlich:

a - b + c

könnte bewertet werden als (vorausgesetzt - und + haben die gleiche Priorität):

((a - b) + c) oder
(a - (b + c))

Wenn Operatoren assoziativ bleiben (sofort an den linken Operanden binden), wird dies als erster ausgewertet. Wenn sie richtig assoziativ sind, wird sie als zweite ausgewertet.


1

Wenn Sie Operatorassoziativität meinen:

Es definiert die Art und Weise, wie Ausdrücke analysiert werden. Es gibt einen Standard, sodass jeder Ausdruck auf die gleiche Weise analysiert wird.

Es ist vor allem bei Operationen mit der gleichen Priorität wichtig, wenn Nebenwirkungen auftreten können.


0

Die meisten vorherigen Beispiele haben Konstanten verwendet. Wenn es sich bei den Argumenten zufällig um Funktionsaufrufe handelt, kann die Reihenfolge, in der die Aufrufe ausgeführt werden, durch die Zuordnungsregeln bestimmt werden, natürlich abhängig von Ihrem Compiler. Und wenn diese Funktionen Nebenwirkungen haben ..


0

Wir alle wissen, dass Vorrang wichtig ist, aber auch Assoziativität bei der Interpretation der Bedeutung eines Ausdrucks. Versuchen Sie für eine wirklich einfache Einführung Power of Operators .


0

Die Assoziativität fällt in den Programmiersprachenkonzepten unter die Reihenfolge der Berechnung. Die Reihenfolge der Berechnung bestimmt die Bedeutung des Ausdrucks. Es gibt zwei Hauptregeln:

  1. Vorrangregeln
  2. Assoziativitätsregeln

Prioritätsregeln definieren die Reihenfolge, in der "benachbarte" Operatoren verschiedener Typen ausgewertet werden. Jede Programmiersprache hat eine eigene Operator-Prioritätstabelle für ihre Operatoren.

Zurück zur Assoziativität,

Es definiert die Ausführungsreihenfolge benachbarter Operationen mit derselben Priorität. Es hat 3 Geschmacksrichtungen,

linke Assoziativität
rechte Assoziativität
Nichtassoziativität

Wenn ein Operator linksassoziativ ist, wird er ebenfalls von links nach rechts ausgewertet. Wenn er rechtsassoziativ ist, wird er von rechts nach links ausgewertet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.