В чем разница между приоритетом, ассоциативностью и порядком? - PullRequest
4 голосов
/ 16 сентября 2008

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

Что вы думаете об этом?

Ответы [ 3 ]

8 голосов
/ 16 сентября 2008

Приоритет правила определяют приоритет операторов (какие операторы будут оцениваться первыми, например, умножение имеет более высокий приоритет, чем сложение, PEMDAS).

Правила ассоциативности говорят о том, как группируются операторы с одинаковым приоритетом. Арифметические операторы являются левоассоциативными, но присвоение является ассоциативно правым (например, a = b = c будет оцениваться как b = c, a = b).

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

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

2 голосов
/ 16 сентября 2008

Приоритет и ассоциативность определяют, как и в каком порядке термин должен быть разбит на подтермы. Другими словами, он определяет правила, в которых квадратные скобки должны устанавливаться неявно, если не указано явно.

Если у вас есть термин без скобок, вы начинаете с операторов с наименьшим приоритетом и заключаете его в квадратные скобки.

Например:

Precendences:

  1. .
  2. !
  3. *, /
  4. +, -
  5. ==
  6. &&

Термин:

!person.isMarried && person.age == 25 + 2 * 5

будет сгруппировано так:

  1. ! (Person.isMarried) && (person.age) == 25 + 2 * 5
  2. (! (Person.isMarried)) && (person.age) == 25 + 2 * 5
  3. (! (Person.isMarried)) && (person.age) == 25 + (2 * 5)
  4. (! (Person.isMarried)) && (person.age) == (25 + (2 * 5))
  5. (! (Person.isMarried)) && ((person.age) == (25 + (2 * 5)))
  6. ((! (Person.isMarried)) && ((person.age) == (25 + (2 * 5))))

Одним из очень распространенных правил является приоритет * и / перед + и -.

Ассоциативность указывает, в каком направлении сгруппированы операторы одного и того же приоритета. Большинство операторов слева направо. Унарные префиксные операторы справа налево.

Пример: * * тысяча сорок шесть

1 + 2 + 3 + 4

сгруппировано так:

  1. (1 + 2) + 3 + 4
  2. ((1 + 2) + 3) + 4
  3. (((1 + 2) + 3) + 4)

, а

!! + 1

сгруппирован как

  1. !! (+ 1)
  2. ! (! (+ 1))
  3. (! (! (+ 1)))

Пока все соответствует правилам BODMAS / PEDMAS, с какими различиями вы столкнулись?

2 голосов
/ 16 сентября 2008

Я не уверен, что действительно есть разница. Традиционные BODMAS (скобки, порядки, деление, умножение, сложение, вычитание) или PEDMAS (скобки, экспоненты, деление, умножение, сложение, вычитание) являются лишь подмножествами всех возможных операций и обозначают порядок, в котором такие операции должны применяться в Я не знаю ни одного языка, на котором бы нарушались правила BODMAS / PEDMAS, но каждый язык обычно добавляет различные другие операторы, такие как ++, -, = и т. Д.

Я всегда держу список приоритетов операторов под рукой в ​​случае путаницы. Однако, если вы сомневаетесь, обычно стоит использовать несколько скобок, чтобы прояснить смысл. Просто имейте в виду, что скобки не имеют наивысшего приоритета - см. http://msdn.microsoft.com/en-us/library/126fe14k.aspx для примера на C ++.

...