Was ist Assoziativität (für einen Operator) und warum ist sie wichtig?
Aktualisiert: Operatorassoziativität
Was ist Assoziativität (für einen Operator) und warum ist sie wichtig?
Aktualisiert: Operatorassoziativität
Antworten:
Assoziativität bedeutet für Operatoren, dass, wenn derselbe Operator in einer Reihe erscheint, zuerst das Auftreten des Operators angewendet wird. Im Folgenden sei Q
der Operator
a Q b Q c
Wenn Q
es 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
expr -> expr + term;
ist links assoziativ und expr -> term + expr
ist rechts assoziativ.
a * b / c
bewertet, 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.
Es gibt drei Arten von Assoziativität:
Die assoziative Eigenschaft in der Mathematik
Reihenfolge der Operationen in Programmiersprachen
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.
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 % 5
bewertet zu 2
, nicht 0
.
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:
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.
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.
Die Situation 3 - 2 - 1
mag 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 512
statt
(2 ** 3) ** 2
das heißt 8 ** 2
, dh 64
.
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.
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.
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 ..
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 .
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:
- Vorrangregeln
- 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.