Qu'est-ce que l'associativité (pour un opérateur) et pourquoi est-elle importante?
Mise à jour: associativité des opérateurs
Qu'est-ce que l'associativité (pour un opérateur) et pourquoi est-elle importante?
Mise à jour: associativité des opérateurs
Réponses:
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, Q
soit l'opérateur
a Q b Q c
Si Q
est 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
expr -> expr + term;
est associatif à gauche et expr -> term + expr
associatif à droite.
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.
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.
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 % 5
évalue 2
, non 0
.
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:
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.
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.
La situation 3 - 2 - 1
peut 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
.
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.
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.
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 ...
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 .
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,
- Règles de préséance
- 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.