Ассоциативность C99 для операторов - где это указано? - PullRequest
8 голосов
/ 23 февраля 2012

В стандарте C99 выражения допускают приоритет и ассоциативность.

Приоритет задокументирован довольно хорошо, поскольку порядок, в котором операторы появляются в документе, имеет меньший приоритет, поэтому вызовы функций предшествуют мультипликативным операторам, которые, в свою очередь, предшествуют аддитивным операторам.

Однако я не могу найти однозначного описания ассоциативности, будь то левое или правое. Это важно, поскольку 35/5*2 будет 14 для одного варианта (35/5)*2 и 3 для другого варианта 35/(5*2).

Раздел 6.5 Expressions /3, footnote 74 Состояние:

Синтаксис определяет приоритет операторов при вычислении выражения, который совпадает с порядком основных подпунктов этого подпункта, причем сначала самый высокий приоритет.

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

Однако, принимая мультипликативный случай, например:

6.5.5 Мультипликативные операторы
Синтаксис
multiplicative-expression:
cast-expression
multiplicative-expression * cast-expression
multiplicative-expression / cast-expression
multiplicative-expression % cast-expression

Ограничения

Каждый из операндов должен иметь арифметический тип. Операнды оператора % должны имеют целочисленный тип.

Семантика

Обычные арифметические преобразования выполняются над операндами.

Результат бинарного оператора * является произведением операндов.

Результатом оператора / является частное от деления первого операнда на второй; результат оператора % - остаток. В обеих операциях, если значение второй операнд равен нулю, поведение не определено.

Когда целые числа делятся, результатом оператора / является алгебраический фактор с любым дробная часть отбрасывается. Если частное a/b представимо, выражение (a/b)*b + a%b должно быть равно a.

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

Я что-то здесь упускаю?

Ответы [ 2 ]

9 голосов
/ 23 февраля 2012

Оперативная ассоциативность явно не указана как «правосторонняя» или «левосторонняя».Вы выводите это из грамматики.В вашем примере термин multiplicative-expression относится к самому себе рекурсивно, а рекурсия находится в левой части оператора.Это означает, что синтаксический анализатор, встречающий a * b * c, должен анализировать a * b * c подобно (a * b) * c, который является ассоциативным слева.

Термин assignment-expression (6.5.16) имеет следующую грамматику:

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

Таким образом, синтаксический анализатор, встречающий a = b = c, должен проанализировать его как a = (b = c), который является ассоциативным справа.

3 голосов
/ 23 февраля 2012

Грамматика сама определяет ассоциативность, используемую продукцию:

multiplicative-expression:
  cast-expression
  multiplicative-expression * cast-expression

Это означает, что в a * b * c, c должны быть проанализированы как cast-expression, а a * b как один multiplicative-expression, до дальнейшего разбора самого a * b.Таким образом, левая ассоциативность умножения вводится в синтаксическое дерево по правилам синтаксического анализа.

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