Что такое ассоциативность (для оператора) и почему она важна?
Обновлено: ассоциативность операторов
Что такое ассоциативность (для оператора) и почему она важна?
Обновлено: ассоциативность операторов
Ответы:
Для операторов ассоциативность означает, что когда один и тот же оператор появляется в строке, то какой оператор мы применяем в первую очередь. В дальнейшем пусть Q
- оператор
a Q b Q c
Если Q
левоассоциативный, то он оценивается как
(a Q b) Q c
И если он правильно ассоциативен, то оценивается как
a Q (b Q c)
Это важно, так как меняет смысл выражения. Рассмотрим оператор деления с целочисленной арифметикой, который является левоассоциативным.
4 / 2 / 3 <=> (4 / 2) / 3 <=> 2 / 3 = 0
Если бы он был правильно ассоциативным, он оценил бы неопределенное выражение, так как вы бы делили на ноль
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
expr -> expr + term;
он ассоциативен слева и ассоциативен expr -> term + expr
справа.
a * b / c
оценить, *
будет ли оно левоассоциативным, но /
правоассоциативным? Тогда есть противоречие. Поэтому я думаю, что нужно сказать «когда операторы с одинаковым приоритетом и ассоциативностью», если вы хотите охватить несколько операторов.
Есть три вида ассоциативности:
Ассоциативное свойство в математике
Порядок операций в языках программирования
Свойство ассоциативности в математике - это свойство таких операторов, как сложение (+). Это свойство позволяет вам переставлять круглые скобки, не меняя значения оператора, то есть:
(a + b) + c = a + (b + c)
В языках программирования ассоциативность (или фиксированность) оператора - это свойство, которое определяет, как операторы с одинаковым приоритетом группируются при отсутствии круглых скобок; т.е. в каком порядке оценивается каждый оператор. Это может отличаться в зависимости от языка программирования.
В кэшах ЦП ассоциативность - это метод оптимизации производительности.
Просто!!
Left Associative means we evaluate our expression from left to right
Right Associative means we evaluate our expression from right to left
Мы знаем, что *, / и% имеют одинаковый приоритет, но в соответствии с ассоциативностью ответ может измениться:
Например: у нас есть выражение: 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
оценивает 2
, а не 0
.
Если вы имеете в виду «ассоциативность операторов» - это то, как язык определяет, как операторы с одинаковым приоритетом группируются без скобок.
Например, операторы + и - в языках на основе C имеют одинаковый приоритет. Когда вы пишете выражение, которое использует оба из них (без скобок), компилятор должен определить, в каком порядке их оценивать.
Если вы напишете 12 - 5 + 3, возможные оценки включают:
В зависимости от порядка, в котором вы оцениваете выражение, вы можете получить разные результаты. В языках на основе C + и - оставили ассоциативность, что означает, что выражение выше будет оцениваться как первый регистр.
У всех языков есть строго определенные правила как для приоритета, так и для ассоциативности. Вы можете узнать больше о правилах для C # здесь. Общие концепции ассоциативности и приоритета операторов подробно описаны в Википедии.
это порядок оценки для операторов с одинаковым приоритетом. Порядок «ВЛЕВО НАПРАВО» или «ВПРАВО НАЛЕВО» имеет значение. За
3 - 2 - 1
если он СЛЕВА НАПРАВО, то это
(3 - 2) - 1
и равно 0. Если это ВПРАВО НАЛЕВО, то это
3 - (2 - 1)
и это 2. В большинстве языков мы говорим, что оператор минус имеет ассоциативность ВЛЕВО НАПРАВО.
Ситуация 3 - 2 - 1
может показаться тривиальной, если заявить: «Конечно, мы делаем это слева направо». Но в других случаях, например, в Ruby или NodeJS:
$ irb
2.6.3 :001 > 2 ** 3 ** 2
=> 512
Оператор **
«во власти». Ассоциативность - справа налево. И это
2 ** (3 ** 2)
что есть 2 ** 9
, т. е. 512
вместо
(2 ** 3) ** 2
что 8 ** 2
, то есть 64
.
Я предполагаю, что вы имеете в виду ассоциативность операторов ...
Это порядок привязки операндов к оператору. В принципе:
а - б + в
может быть оценено как (при условии, что - и + имеют одинаковый приоритет):
((a - b) + c) или,
(a - (b + c))
Если операторы оставлены ассоциативными (сразу же связываются с левым операндом), он будет оценен как первый. Если они правильно ассоциативны, это будет оценено как второе.
Все мы знаем, что приоритет важен, но не менее важна ассоциативность при интерпретации значения выражения. Для действительно простого вступления попробуйте Power of Operators .
В концепциях языка программирования ассоциативность определяется порядком вычислений. Порядок вычисления определяет смысл выражения. В нем есть два основных правила:
- Правила приоритета
- Правила ассоциативности
Правила приоритета определяют порядок, в котором оцениваются «смежные» операторы разных типов. Каждый язык программирования имеет свою собственную таблицу приоритета операторов в отношении своих операторов.
Возвращаясь к ассоциативности,
Он определяет порядок выполнения смежных операций с одинаковым приоритетом. Имеет 3 вкуса,
левоассоциативность
правоассоциативность
неассоциативность
Если оператор левоассоциативен, он оценивается слева направо, а если он ассоциативен справа, он оценивается справа налево.