В стандарте 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
.
Я не вижу там ничего, что упоминало бы ассоциативность, и, похоже, нет других настроек по умолчанию в других местах стандарта.
Я что-то здесь упускаю?