Что такое ассоциативность операторов и почему это важно?

StackOverflow https://stackoverflow.com/questions/930486

  •  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, возможные оценки включают в себя:

  1. (12 - 5) + 3 = 10
  2. 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))

Если операторы являются левоассоциативными (привязываются непосредственно к левому операнду), они будут оцениваться как первые.Если они являются правильными ассоциативными, это будет оценено как второе.

Если вы имеете в виду ассоциативность операторов:

Он определяет способ анализа выражений.Это дает стандарт, поэтому каждое выражение анализируется одинаково.

Это особенно важно для операций, которые имеют одинаковый прецедент, когда могут возникнуть побочные эффекты.

В большинстве предыдущих примеров использовались константы.Если аргументы являются вызовами функций, порядок, в котором выполняются вызовы, может определяться правилами ассоциации, в зависимости, конечно, от вашего компилятора.И если эти функции имеют побочные эффекты ..

Мы все знаем, что приоритет важен, но так же важна ассоциативность при интерпретации значения выражения.Для действительно простого вступления попробуйте Власть операторов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top