Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

В языках программирования , то ассоциативность из оператора является свойством , которое определяет , как операторы одинакового старшинства сгруппированы в отсутствии скобок . Если операнду предшествуют операторы, за которыми следуют операторы (например, ^ 3 ^), и эти операторы имеют одинаковый приоритет, то операнд может использоваться в качестве входных данных для двух разных операций (т. Е. Двух операций, указанных двумя операторами). Выбор операций для применения операнда определяется ассоциативностью операторов. Операторы могут быть ассоциативными (то есть операции могут быть сгруппированы произвольно),левоассоциативный (то есть операции сгруппированы слева), правоассоциативный (то есть операции сгруппированы справа) или неассоциативный (то есть операции не могут быть связаны , часто потому, что тип вывода несовместим с типами ввода) . Ассоциативность и приоритет оператора - это часть определения языка программирования; разные языки программирования могут иметь разную ассоциативность и приоритет для одного и того же типа оператора.

Рассмотрим выражение a ~ b ~ c. Если оператор ~оставил ассоциативность, это выражение будет интерпретироваться как (a ~ b) ~ c. Если оператор имеет правильную ассоциативность, выражение будет интерпретироваться как a ~ (b ~ c). Если оператор неассоциативен, выражение может быть синтаксической ошибкой или иметь какое-то особое значение. Некоторым математическим операторам присуща ассоциативность. Например, вычитание и деление, используемые в обычных математических обозначениях, по своей сути левоассоциативны. Сложение и умножение, напротив, ассоциативны как слева, так и справа. (например (a * b) * c = a * (b * c)).

Многие руководства по языкам программирования содержат таблицы приоритета операторов и ассоциативности; см., например, таблицу для C и C ++ .

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

Примеры [ править ]

Ассоциативность необходима только в том случае, если операторы в выражении имеют одинаковый приоритет. Обычно +и -имеют такой же приоритет. Рассмотрим выражение 7 − 4 + 2. Результатом может быть либо, (7 − 4) + 2 = 5либо 7 − (4 + 2) = 1. Первый результат соответствует случаю, когда +и являются левоассоциативными, второй - когда +и -являются правоассоциативными.

Чтобы отразить нормальное использование, операторы сложения , вычитания , умножения и деления обычно являются левоассоциативными, [1] [2] [3] [4] [5], тогда как для оператора возведения в степень (если есть) [6] и По операторам Кнута, направленным вверх, нет общего согласия. Любые операторы присваивания обычно правоассоциативны. Чтобы предотвратить случаи, когда операнды были бы связаны с двумя операторами или вообще без оператора, операторы с одинаковым приоритетом должны иметь одинаковую ассоциативность.

Подробный пример [ править ]

Рассмотрим выражение 5^4^3^2, в котором ^предполагается правоассоциативный оператор возведения в степень. Синтаксический анализатор, читающий токены слева направо, применил бы правило ассоциативности к ветви из-за правой ассоциативности ^следующим образом:

  1. Срок 5прочитан.
  2. Нетерминал ^читается. Узел: " 5^".
  3. Срок 4прочитан. Узел: " 5^4".
  4. Читается нетерминал ^, запускается правило правоассоциативности. Ассоциативность решает узел: " 5^(4^".
  5. Срок 3прочитан. Узел: " 5^(4^3".
  6. Читается нетерминал ^, вызывая повторное применение правила правой ассоциативности. Узел " 5^(4^(3^".
  7. Срок 2прочитан. Узел " 5^(4^(3^2".
  8. Нет жетонов для чтения. Примените ассоциативность для создания дерева синтаксического анализа " 5^(4^(3^2))".

Затем это можно оценить в глубину, начиная с верхнего узла (первого ^):

  1. Оценщик проходит по дереву от первого, по второму, к третьему ^выражению.
  2. Он оценивается как: 3 2 = 9. Результат заменяет ветвь выражения вторым операндом второго ^.
  3. Оценка продолжается на один уровень вверх по дереву синтаксического анализа : 4 9 = 262144. И снова результат заменяет ветвь выражения как второй операнд первого ^.
  4. И снова оценщик продвигается вверх по дереву к корневому выражению и вычисляет: 5 262144 ≈ 6,2060699 × 10 183230 . Последняя оставшаяся ветвь сворачивается, и результат становится общим результатом, тем самым завершая общую оценку.

((5^4)^3)^2Левоассоциативная оценка привела бы к дереву синтаксического анализа и совершенно другим результатам 625, 244140625 и, наконец, ~ 5,9604645 × 10 16 .

Правоассоциативность операторов присваивания [ править ]

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

Например, в C присвоение a = b- это выражение, которое возвращает значение (а именно, bпреобразованное в тип a) с побочным эффектом установки aэтого значения. [a] Присваивание может выполняться в середине выражения. Правоассоциативность =оператора позволяет a = b = cинтерпретировать такие выражения как a = (b = c), тем самым устанавливая для обоих aи bзначение c. В C альтернатива (a = b) = cне имеет смысла, потому что a = bэто не l-значение , а просто r-значение. Однако в C ++ присваивание a = bвозвращает значение, относящееся к левому члену присваивания. Следовательно,(a = b) = cможно интерпретировать как a = b; a = c;.

Неассоциативные операторы [ править ]

Неассоциативные операторы - это операторы, которые не имеют определенного поведения при последовательном использовании в выражении. В Прологе оператор инфиксныма :-является неассоциативным потому конструкция , такими как « a :- b :- c» представляют собой синтаксические ошибки.

Другая возможность состоит в том, что последовательности определенных операторов интерпретируются другим способом, который не может быть выражен как ассоциативность. Обычно это означает, что синтаксически существует особое правило для последовательностей этих операций, а семантически поведение отличается. Хороший пример - Python , в котором есть несколько таких конструкций. [7] Поскольку присваивания являются операторами, а не операциями, оператор присваивания не имеет значения и не ассоциативен. Цепное присвоение вместо этого реализуется с помощью правила грамматики для последовательностей назначений a = b = c, которые затем назначаются слева направо. Кроме того, комбинации присваивания и расширенного присваивания, напримерa = b += cне являются законным в Python, хотя они являются законной C. Другим примером являются операторами сравнения, такими как >, ==, и <=. Цепное сравнение, подобное a < b < cинтерпретируется как (a < b) and (b < c), не эквивалентно ни (a < b) < cили a < (b < c). [8]

См. Также [ править ]

  • Порядок действий (в арифметике и алгебре)
  • Обозначения общих операторов (в языках программирования)
  • Ассоциативность (математическое свойство ассоциативности)

Заметки [ править ]

  1. ^ Выражение можно превратить в оператор, поставив после него точку с запятой; т.е.a = bэто выражение, ноa = b;это утверждение.

Ссылки [ править ]

  1. ^ Бронштейн, Илья Николаевич; Семендяев, Константин Адольфович (1987) [1945]. «2.4.1.1.». В Гроше, Гюнтер; Зиглер, Виктор; Зиглер, Доротея (ред.). Taschenbuch der Mathematik (на немецком языке). 1 . Перевод Виктор Зиглер. Вайс, Юрген (23-е изд.). Тун и Франкфурт-на-Майне: Verlag Harri Deutsch (и BG Teubner Verlagsgesellschaft , Лейпциг). С. 115–120. ISBN 3-87144-492-8.
  2. ^ Хемницкий технологический университет : приоритет и ассоциативность операторов ( заархивированный перевод )
  3. ^ Место обучения: Порядок действий
  4. ^ Khan Academy : Порядок операций , метки времени 5m40s
  5. ^ Департамент образования Вирджинии: Использование порядка операций и исследования свойств , раздел 9
  6. ^ Ассоциативность возведения в степень и стандартная математическая нотация Codeplea. 23 авг 2016. Проверено 20 сен 2016.
  7. ^ Справочник по языку Python , « 6. Выражения »
  8. ^ Справочник по языку Python , « 6. Выражения »: 6.9. Сравнения