2009-05-30 19 views
61

Qu'est-ce que associativité (pour un opérateur) et pourquoi est-il important?Qu'est-ce que l'associativité des opérateurs et pourquoi est-ce important?

Mise à jour: opérateur associativité

+2

Quel type d'associativité? L'associativité des opérateurs? – Ikke

+1

-1: vague. Un indice sur le contexte ou sur ce que vous voulez savoir? –

+16

@Neil Butterworth - C'est un commentaire particulièrement sévère pour ce qui semble être une question raisonnable. Tout le but du site est d'être un référentiel central pour TOUTES les connaissances en programmation, y compris les choses couvertes dans les textes d'introduction. Quant à vous, commentez @Jian Lin répondant à son propre commentaire qui est aussi acceptable comme indiqué dans la première question de la FAQ officielle. Quelqu'un avec votre niveau de représentant devrait savoir mieux. Si vous n'êtes pas d'accord avec cela, soyez au moins indulgents à ce sujet. –

Répondre

65

Pour les opérateurs, associativité signifie que lorsque le même opérateur apparaît dans une rangée, puis qui nous appliquons l'opérateur occurence d'abord.Dans ce qui suit, nous allons Q être l'opérateur

a Q b Q c 

Si Q est associative gauche, il évalue comme

(a Q b) Q c 

Et si elle est associative à droite, puis il évalue comme

a Q (b Q c) 

C'est important, car cela change la signification d'une expression. Considérons l'opérateur de division avec l'arithmétique entière, qui reste associative

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

Si elle était associative droite, il évaluerait une expression non définie, puisque vous divisez par zéro

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

Savez-vous comment trouver l'associativité que ce soit est gauche ou droite pour grammer donné? – user2510115

+1

si la grammaire a une règle de production récursive gauche/droite. –

+0

Par exemple, 'expr -> expr + term;' est associatif gauche et 'expr -> term + expr' est associatif. –

2

Je suppose que vous parlez associativité de l'opérateur ...

Il est l'ordre de liaison des opérandes à un opérateur. Fondamentalement:

a - b + c

peut être évaluée en tant que (dans l'hypothèse - et + ont la même priorité):

((a - b) + c) ou,
(a - (b + c))

Si les opérateurs sont laissés associatif (lier immédiatement à l'opérande gauche), il sera évalué comme la première. Si elles sont associatives, elles seront évaluées comme la seconde.

7

Il existe trois types de associativité:

The Associative property in mathematics

Order of Operations in programming languages

Associativity in CPU caches.

La propriété Associatif en mathématiques est une propriété des opérateurs tels que l'addition (+). Cette propriété permet de réarranger entre parenthèses sans changer la valeur d'une déclaration, à savoir:

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

Dans les langages de programmation, l'associativité (ou fixité) d'un opérateur est une propriété qui détermine la façon dont les opérateurs de même priorité sont regroupés dans le absence de parenthèses; c'est-à-dire dans quel ordre chaque opérateur est évalué. Cela peut différer entre les langages de programmation.

Dans les caches CPU, associativité est une méthode d'optimisation de la performance.

+0

* l'associativité (ou fixité) d'un opérateur est une propriété qui détermine comment les opérateurs de même priorité sont groupés en l'absence de parenthèses * - cette phrase était juste parfaite pour me faire comprendre –

1

Si vous voulez dire associativité opérateur:

Il définit les expressions façon sont analysées. Cela donne un standard, donc chaque expression est analysée de la même manière.

Il est surtout important pour les opérations qui ont la même precedense, quand il pourrait y avoir des effets secondaires.

3

est l'ordre d'évaluer pour les opérateurs de la même précédence. L'ordre GAUCHE À DROITE ou DROIT À GAUCHE est important. Pour

3 - 2 - 1 

si elle est de gauche à droite, il est

(3 - 2) - 1 

et est 0. Si elle est droite à gauche, il est

3 - (2 - 1) 

et il est 2 Dans la plupart des langages, nous disons que l'opérateur moins a une associativité GAUCHE À DROITE.

+3

Si vous saviez déjà la réponse, alors pourquoi avez-vous posé la question? –

+2

c'était pour aider de nouvelles personnes. Je me souviens d'avoir appris C il y a longtemps et je ne savais pas ce que l'associativité était vraiment avant. –

+3

Je soupçonne que la plupart des gens qui apprennent C peuvent se passer de votre «aide». –

4

Si vous faites référence à «l'associativité de l'opérateur», c'est la façon dont un langage détermine comment les opérateurs de même priorité sont groupés en l'absence de parenthèses.

Par exemple, les opérateurs + et - dans les langages C ont la même priorité. . Lorsque vous écrivez une expression qui utilise les deux (sans parenthèses) le compilateur doit déterminer dans quel ordre les évaluer dans

Si vous écrivez 12-5 + 3, les évaluations possibles sont les suivantes:

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

en fonction de l'ordre que vous évaluez l'expression, vous pouvez obtenir des résultats différents. Dans les langages basés sur C, + et - ont quitté l'associativité, ce qui signifie que l'expression ci-dessus serait évaluée comme le premier cas.

Tous les langages ont des règles fortement définies pour la précédence et l'associativité. Vous pouvez en apprendre plus sur les règles pour C# ici. Les concepts généraux de l'opérateur associativity et precedence sont bien couverts sur wikipedia.

+0

Vos exemples seraient plus clairs s'ils utilisaient tous les mêmes opérandes. –

+0

Que se passerait-il si deux opérateurs avec la même précédence apparaissaient dans une expression sans parantheses, mais l'un d'entre eux avait quitté l'associativité et l'autre avait raison? Serait-il simplement utiliser l'associativité de quel opérateur qu'il trouve en premier? – Hector

0

La plupart des exemples précédents ont utilisé des constantes. Si les arguments sont des appels de fonction, l'ordre dans lequel les appels sont faits peut être déterminé par les règles d'association, en fonction bien sûr de votre compilateur. Et si ces fonctions ont des effets secondaires ..

0

Nous savons tous que la précédence est importante, mais il en est de même de l'associativité dans l'interprétation de la signification d'une expression.Pour une intro vraiment simple, essayez Power of Operators.

2

Simple !! Left Associative signifie que nous évaluons notre expression de gauche à droite.

Right Associative signifie que nous évaluons notre expression du côté droit à gauche.

Nous savons que *,/et% ont la même priorité, mais selon l'associativité, la réponse peut changer.

Pour exemple: J'ai exp: 4 * 8/2% 5

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

associative droite: 4 * 8/(2% 5) ==> 4 * (8/0) ==> comportement non défini

J'espère que cela aiderait. . .