Что такое ассоциативность операторов и почему это важно?
-
06-09-2019 - |
Вопрос
Что такое ассоциативность (для оператора) и почему это важно?
Обновленный: ассоциативность операторов
Решение
Для операторов ассоциативность означает, что когда один и тот же оператор появляется в строке, то какое вхождение оператора мы применяем первым.В дальнейшем пусть 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
Другие советы
Существует три вида ассоциативности:
Ассоциативное свойство в математике
Порядок выполнения операций в языках программирования
Ассоциативность в кэшах процессора.
Ассоциативное свойство в математике - это свойство таких операторов, как сложение (+).Это свойство позволяет вам переставлять круглые скобки без изменения значения оператора, т.е.:
(a + b) + c = a + (b + c)
В языках программирования ассоциативность (или фиксированность) оператора - это свойство, которое определяет, как операторы с одинаковым приоритетом группируются в отсутствие из круглых скобок;т. е.в каком порядке вычисляется каждый оператор.Это может отличаться в зависимости от языков программирования.
В кэшах процессора ассоциативность - это метод оптимизации производительности.
это порядок вычисления для операторов с одинаковым приоритетом.Порядок следования СЛЕВА НАПРАВО или СПРАВА НАЛЕВО имеет значение.Для
3 - 2 - 1
если это СЛЕВА НАПРАВО, то это
(3 - 2) - 1
и равно 0.Если это СПРАВА налево, то это
3 - (2 - 1)
и это 2.В большинстве языков мы говорим, что оператор минус имеет ассоциативность СЛЕВА НАПРАВО.
Если вы имеете в виду "ассоциативность операторов" - это то, как язык определяет, как операторы с одинаковым приоритетом группируются при отсутствии круглых скобок.
Например, операторы + и - в языках, основанных на C, имеют одинаковый приоритет.Когда вы пишете выражение, которое использует их оба (без круглых скобок), компилятор должен определить, в каком порядке их оценивать.
Если вы напишете 12 - 5 + 3, возможные оценки включают в себя:
- (12 - 5) + 3 = 10
- 12 - (5 + 3) = 4
В зависимости от порядка, в котором вы вычисляете выражение, вы можете получить разные результаты.В языках, основанных на C, + и - имеют левую ассоциативность, что означает, что приведенное выше выражение будет оцениваться как первый случай.
Все языки имеют строго определенные правила как для приоритета, так и для ассоциативности.Вы можете узнать больше о правилах для 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))
Если операторы являются левоассоциативными (привязываются непосредственно к левому операнду), они будут оцениваться как первые.Если они являются правильными ассоциативными, это будет оценено как второе.
Если вы имеете в виду ассоциативность операторов:
Он определяет способ анализа выражений.Это дает стандарт, поэтому каждое выражение анализируется одинаково.
Это особенно важно для операций, которые имеют одинаковый прецедент, когда могут возникнуть побочные эффекты.
В большинстве предыдущих примеров использовались константы.Если аргументы являются вызовами функций, порядок, в котором выполняются вызовы, может определяться правилами ассоциации, в зависимости, конечно, от вашего компилятора.И если эти функции имеют побочные эффекты ..
Мы все знаем, что приоритет важен, но так же важна ассоциативность при интерпретации значения выражения.Для действительно простого вступления попробуйте Власть операторов.