Qu'est-ce que l'associativité des opérateurs et pourquoi est-elle importante?


88

Qu'est-ce que l'associativité (pour un opérateur) et pourquoi est-elle importante?

Mise à jour: associativité des opérateurs


2
Quel genre d'associativité? Associativité des opérateurs?
Ikke

26
@Neil Butterworth - C'est un commentaire particulièrement dur pour ce qui semble être une question raisonnable. 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 la réponse de @Jian Lin à son propre commentaire, cela est également 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, soyez au moins courtois à ce sujet.
Rob Allen

1
@Rob Allen Voir ses autres messages. De plus, je n'ai pas dit qu'il ne devrait pas répondre à son propre message, seulement que ce n'était pas utile. Et je vais vous faire un marché - je ne vous dirai pas comment formuler vos messages ici si vous ne me dites pas comment formuler les miens.

Réponses:


105

Pour les opérateurs, l'associativité signifie que lorsque le même opérateur apparaît dans une ligne, alors quelle occurrence d'opérateur nous appliquons en premier. Dans ce qui suit, Qsoit l'opérateur

a Q b Q c

Si Qest laissé associatif, alors il s'évalue comme

(a Q b) Q c

Et s'il est bien associatif, alors il s'évalue comme

a Q (b Q c)

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

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

Si c'était associatif correct, il serait évalué à une expression non définie, puisque vous diviseriez par zéro

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

savez-vous comment trouver l'associativité qu'elle soit à gauche ou à droite pour un grammaire donné?
user2510115

1
Par exemple, il expr -> expr + term;est associatif à gauche et expr -> term + exprassociatif à droite.
Subin Sebastian

15
Dans la première ligne de votre réponse, au lieu de «lorsque le même opérateur apparaît», il est plus approprié de dire «lorsque des opérateurs de même priorité apparaissent». Exemple: a * b / c => où * et / ont la même priorité.
1O1 le

2
@ 1O1 merci, mais que se passe-t-il si ces opérateurs avec la même priorité ont une associativité différente? Comment a * b / cévaluer si *serait associatif de gauche mais /associatif de droite? Ensuite, il y a une contradiction. Je pense donc qu'il faut dire "lorsque les opérateurs ont la même priorité et la même associativité" si vous voulez couvrir plusieurs opérateurs.
Johannes Schaub - litb

2
@Mark je ne sais pas, mais je ne sais pas comment cela devrait fonctionner. Vaut probablement une question supplémentaire de stackoverflow
Johannes Schaub - litb

13

Il existe trois types d'associativité:

La propriété associative en mathématiques

Ordre des opérations dans les langages de programmation

Associativité dans les caches CPU.

La propriété associative en mathématiques est une propriété d'opérateurs tels que l'addition (+). Cette propriété vous permet de réorganiser les parenthèses sans changer la valeur d'une instruction, c'est-à-dire:

(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 comment les opérateurs de même priorité sont groupés en l' 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, l'associativité est une méthode d'optimisation des performances.


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

7

Facile!!

Left Associative means we evaluate our expression from left to right

Right Associative means we evaluate our expression from right to left 

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

Par exemple: Nous avons l'expression: 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
Il semble y avoir une erreur dans la réponse: 2 % 5évalue 2, non 0.
6005

5

Si vous faites référence à «l'associativité des opérateurs», c'est ainsi qu'un langage détermine comment les opérateurs de même priorité sont regroupés en l'absence de parenthèses.

Par exemple, les opérateurs + et - dans les langages basés sur 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.

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

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

Selon l'ordre dans lequel vous évaluez l'expression, vous pouvez obtenir des résultats différents. Dans les langages basés sur C, + et - ont laissé 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éséance et l'associativité. Vous pouvez en savoir plus sur les règles pour C # ici. Les concepts généraux d' associativité et de priorité des opérateurs sont bien couverts sur wikipedia.


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

Que se passerait-il si deux opérateurs avec la même priorité apparaissaient dans une expression sans paranthèses, mais l'un d'eux avait quitté l'associativité et l'autre avait raison? Utiliserait-il simplement l'associativité de l'opérateur qu'il trouve en premier?
Hector

cela ne peut pas arriver car la même préséance signifie la même associativité. si tel n'était pas le cas, il pourrait y avoir des ambiguïtés qui menacent l'existence même de la réalité.
Ankur S

5

c'est l'ordre d'évaluation pour les opérateurs de même priorité. L'ordre de gauche à droite ou de droite à gauche est important. Pour

3 - 2 - 1

s'il est de GAUCHE à DROITE, alors c'est

(3 - 2) - 1

et vaut 0. S'il est de DROITE à GAUCHE, alors c'est

3 - (2 - 1)

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

Mise à jour 2020:

La situation 3 - 2 - 1peut sembler anodine, si la revendication est «bien sûr, nous le faisons de gauche à droite». Mais dans d'autres cas, comme si cela était fait dans Ruby ou dans NodeJS:

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

L' **opérateur est «à la puissance de». L'associativité est de droite à gauche. Et c'est

 2 ** (3 ** 2)

qui est 2 ** 9, c'est-à-dire 512, au lieu de

(2 ** 3) ** 2

qui est 8 ** 2, soit 64.


4
Si vous connaissiez déjà la réponse, pourquoi avez-vous posé la question?
Robert Harvey

6
c'était pour aider de nouvelles personnes. Je me souviens avoir appris C il y a longtemps et je ne savais ce qu'était vraiment l'associativité jusqu'à plus tard.
nonopolarité

3
Je soupçonne que la plupart des gens qui apprennent C peuvent se passer de votre "aide".

1
hm, par exemple, est-ce que l'associativité est limitée au même opérateur, ou est-ce pour les opérateurs du même niveau de priorité? Beaucoup de gens peuvent-ils répondre à coup sûr sans vérifier les livres ou les références?
nonopolarité

13
@Neil Butterworth, pourquoi si hostile? Je pense qu'il est acceptable d'afficher une réponse à votre propre question. Ceci est dans la FAQ, et cela a été mentionné dans le podcast à plusieurs reprises.
Jay Conrod

3

Je suppose que vous voulez dire l'associativité des opérateurs ...

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

a - b + c

peut être évalué comme (en supposant que - et + ont la même priorité):

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

Si les opérateurs sont laissés associatifs (se lient immédiatement à l'opérande de gauche), il sera évalué comme le premier. S'ils sont correctement associatifs, cela sera évalué comme le second.


1

Si vous parlez d'associativité des opérateurs:

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

C'est surtout important pour les opérations qui ont le même précédent, quand il pourrait y avoir des effets secondaires.


0

La plupart des exemples précédents ont utilisé des constantes. Si les arguments se trouvent être des appels de fonction, l'ordre dans lequel les appels sont effectués 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éséance est importante, mais l'associativité l'est aussi dans l'interprétation du sens d'une expression. Pour une introduction vraiment simple, essayez Power of Operators .


0

L'associativité relève de l'ordre du calcul dans les concepts du langage de programmation. L'ordre de calcul détermine la signification de l'expression. Il a deux règles principales,

  1. Règles de préséance
  2. Règles d'associativité

les règles de priorité définissent l'ordre dans lequel les opérateurs «adjacents» de différents types sont évalués. Chaque langage de programmation a sa propre table de priorité des opérateurs concernant ses opérateurs.

Revenant à l'associativité,

Il définit l'ordre d'exécution des opérations adjacentes avec la même priorité. Il a 3 saveurs,

associativité gauche associativité
droite
non associativité

Si un opérateur est associatif à gauche, il évalue de gauche à droite de la même manière s'il est associatif à droite, il évalue de droite à gauche.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.