В стандарте C99 выражения допускают приоритет и ассоциативность.
Приоритет задокументирован достаточно хорошо, поскольку порядок, в котором операторы появляются в документе, снижает приоритет, поэтому вызовы функций идут перед мультипликативными операторами, которые, в свою очередь, предшествуют аддитивным операторам.
Однако я не могу найти окончательного описания ассоциативности, левой или правой.Это важно, поскольку 35/5 * 2
будет 14
для одного варианта (35/5) * 2
и 3
для другой вариант 35 / (5 * 2)
.
Раздел 6.5 Выражения / 3, сноска 74
заявляют:
Синтаксис определяет приоритет операторов при оценке выражения, который совпадает с порядком основных подпунктов этого подпункта , сначала наивысший приоритет.
В каждом основном подпункте операторы имеют одинаковый приоритет. Левая или правая ассоциативность указывается в каждом подпункте синтаксисом обсуждаемых в нем выражений.
Однако, если взять мультипликативный случай, например:
6.5.5 Мультипликативные операторы
Синтаксис
мультипликативное выражение:
выражение-приведение
мультипликативное-выражение * приведенное-выражение
мультипликативное-выражение / приведенное-выражение
мультипликативное-выражение% выражение-приведение
Ограничения
Каждый из операндов должен иметь арифметический тип. Операнды оператора%
должны имеют целочисленный тип.
Семантика
Обычные арифметические преобразования выполняются с операндами.
Результатом двоичного оператора*
является произведение операндов.
Результатом оператора/
является частное от деления первого операнда на второй; результат оператора%
- это остаток.В обеих операциях, если значение второй операнд равен нулю, поведение не определено.
Когда целые числа делятся, результатом оператора/
является алгебраическое частное с любым дробная часть отброшена. Если частноеa / b
представимо, выражение(a / b) * b + a% b
будет равноa
.
Я не вижу здесь ничего, что упоминало бы об ассоциативности, и, похоже, нет никаких настроек по умолчанию где-либо еще в стандарте.
Я что-то здесь упускаю?