Что такое ассоциативность операторов и почему это важно? - PullRequest
76 голосов
/ 31 мая 2009

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

Обновлено: оператор связи

Ответы [ 9 ]

85 голосов
/ 31 мая 2009

Для операторов ассоциативность означает, что когда один и тот же оператор появляется в строке, то к какому оператору мы обращаемся в первую очередь. Далее, пусть 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
11 голосов
/ 31 мая 2009

Существует три вида ассоциативности:

Ассоциативное свойство в математике

Порядок операций на языках программирования

Ассоциативность в кэшах ЦП.

Ассоциативное свойство в математике - это свойство операторов, таких как сложение (+). Это свойство позволяет вам переставлять круглые скобки без изменения значения оператора, т. Е .:

(a + b) + c = a + (b + c)

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

В кешах ЦП ассоциативность - это метод оптимизации производительности.

5 голосов
/ 31 мая 2009

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

Например, операторы + и - в языках на основе C имеют одинаковый приоритет. Когда вы пишете выражение, которое использует оба из них (без скобок), компилятор должен определить, в каком порядке их оценивать.

Если вы напишите 12 - 5 + 3, возможные оценки включают:

  1. (12 - 5) + 3 = 10
  2. 12 - (5 + 3) = 4

В зависимости от порядка вычисления выражения вы можете получить разные результаты. В языках на основе C + и - оставили ассоциативность, что означает, что приведенное выше выражение будет оцениваться как первый случай.

Все языки имеют строго определенные правила как для приоритета, так и для ассоциативности. Вы можете узнать больше о правилах для C # здесь. Общие понятия оператора ассоциативность и приоритет хорошо описаны в википедии.

5 голосов
/ 31 мая 2009

это порядок вычисления для операторов с одинаковым приоритетом. Порядок слева направо или право налево. Для

3 - 2 - 1

если слева, то будет

(3 - 2) - 1

и равно 0. Если ПРАВО ВЛЕВО, то это

3 - (2 - 1)

и равно 2. В большинстве языков мы говорим, что оператор минус имеет ассоциативность ВЛЕВО ВПРАВО.

4 голосов
/ 06 августа 2016

Простой !!

Ассоциация слева означает, что мы оцениваем наше выражение слева направо

Ассоциативно-правый означает, что мы оцениваем наше выражение справа налево

Мы знаем *, / и% имеют одинаковый приоритет, но в зависимости от ассоциативности ответ может измениться:

Например: у нас есть выражение: 4 * 8/2% 5

Ассоциация слева: (4 * 8) / 2% 5 ==> (32/2)% 5 ==> 16% 5 ==> 1

Право ассоциативно: 4 * 8 / (2% 5) ==> 4 * (8/0) ==> Неопределенное поведение

Надеюсь, это поможет.

2 голосов
/ 31 мая 2009

Полагаю, вы имеете в виду ассоциативность операторов ...

Это порядок привязки операндов к оператору. В основном:

a - b + c

может быть оценено как (при условии - и + имеют одинаковый приоритет):

((a - b) + c) или
(a - (b + c))

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

1 голос
/ 31 мая 2009

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

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

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

0 голосов
/ 22 марта 2010

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

0 голосов
/ 31 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...