Что такое ассоциативность (для оператора) и почему это важно?
Обновлено: ассоциация операторов
Что такое ассоциативность (для оператора) и почему это важно?
Обновлено: ассоциация операторов
Для операторов ассоциативность означает, что, когда один и тот же оператор появляется в строке, то какое действие мы применяем первым. В дальнейшем пусть 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
Если бы он был правильным ассоциативным, он оценивал бы выражение undefined, так как вы разделили бы на нуль
4 / 2 / 3 <=> 4 / (2 / 3) <=> 4 / 0 = undefined
Существует три вида ассоциативности:
Ассоциативное свойство в математике
Порядок операций на языках программирования
Ассоциативность в кэшах процессора.
Ассоциативное свойство в математике является свойством операторов, таких как сложение (+). Это свойство позволяет вам скопировать круглые скобки без изменения значения инструкции, т.е.:
(a + b) + c = a + (b + c)
В языках программирования ассоциативность (или фиксированность) оператора является свойством, которое определяет, как операторы с одинаковым приоритетом сгруппированы в отсутствие круглых скобок; т.е. в каком порядке оценивается каждый оператор. Это может различаться между языками программирования.
В кэшах ЦП ассоциативность - это метод оптимизации производительности.
это порядок оценки для операторов с одинаковым приоритетом. ЛЕВАЯ ВРАЩАЮЩАЯСЯ ПРАВО или ПРАВО НА ЛЕВЫЙ порядок. Для
3 - 2 - 1
если LEFT RIGHT, а затем
(3 - 2) - 1
и равно 0. Если оно ПРАВИЛЬНО к ЛЕВЫМ, то оно
3 - (2 - 1)
и оно равно 2. В большинстве языков мы говорим, что оператор минус имеет ЛЕВУЮ ПРАВУЮ ассоциативность.
Если вы имеете в виду "ассоциативность операторов" - это то, как язык определяет, как операторы с одинаковым приоритетом группируются при отсутствии скобок.
Например, операторы + и - в языках на основе C имеют одинаковый приоритет. Когда вы пишете выражение, которое использует оба из них (без скобок), компилятор должен определить, в каком порядке их оценивать.
Если вы напишите 12 - 5 + 3, возможные оценки включают в себя:
В зависимости от порядка, в котором вы оцениваете выражение, вы можете получить разные результаты. В языках на основе C + и - оставили ассоциативность, что означает, что приведенное выше выражение будет оцениваться как первый случай.
Все языки имеют строго определенные правила как для приоритета, так и для ассоциативности. Вы можете узнать больше о правилах для С# здесь. Общие понятия операторской ассоциативности и приоритета хорошо освещены в Википедии.
Просто!!
Левый Ассоциативный означает, что мы оцениваем наше выражение слева направо
Право Ассоциация означает, что мы оцениваем наше выражение справа налево
Мы знаем *,/, и% имеют одинаковый приоритет, но в соответствии с ассоциативностью, ответ может измениться:
Например: у нас есть выражение: 4 * 8/2% 5
Левый ассоциативный: (4 * 8)/2% 5 ==> (32/2)% 5 ==> 16% 5 ==> 1
Правая ассоциация: 4 * 8/(2% 5) ==> 4 * (8/0) ==> Неопределенное поведение
Я надеюсь, что это поможет.
Я предполагаю, что вы имеете в виду ассоциативную ассоциативность...
Это порядок привязки операндов к оператору. В основном:
a - b + c
может быть оценен как (предполагается, что - и + имеют одинаковый приоритет):
((a - b) + c) или,
(a - (b + c))
Если операторы оставлены ассоциативными (немедленно привязать их к левому операнду), он будет оцениваться как первый. Если они являются правильными ассоциативными, это будет оценено как второе.
Если вы имеете в виду ассоциативную ассоциативность:
Он определяет способ анализа выражений. Он дает стандарт, поэтому каждое выражение анализируется одинаково.
В основном это важно для операций, которые имеют такое же приоритет, когда могут быть побочные эффекты.
В большинстве предыдущих примеров использовались константы. Если аргументы являются вызовами функций, порядок, в котором выполняются вызовы, может определяться правилами ассоциации, в зависимости от вашего компилятора. И если эти функции имеют побочные эффекты.
Мы все знаем, что приоритет важен, но также ассоциативность в интерпретации значения выражения. Для действительно простой интро попробуйте Сила операторов.