TL; DR : два описания говорят об одном и том же, используя одни и те же слова и символы с немного отличающимся значением.
С одной стороны, когда я читаю книгу K & R, в ней говорится:
(*ip)++
круглые скобки необходимы в последнем примере; без них выражение будет увеличивать IP вместо того, на что оно указывает,
потому что унарные операторы типа * и ++ ассоциируются справа налево.
Никаких упоминаний о разнице ассоциативности между
постфиксные / префиксные операторы. Оба относятся одинаково. Книга также
утверждает, что * и ++ имеют одинаковый приоритет.
Непонятно, какую редакцию K & R вы читаете, но первая, по крайней мере, рассматривает префиксную и постфиксную версии операторов увеличения и уменьшения как один оператор каждый, причем эффекты зависят от того, предшествует или следует их операнд им.
С другой стороны, эта страница гласит:
1) Приоритет префикса ++ и * одинаков. Ассоциативность обоих
справа налево.
2) Приоритет постфикса ++ выше, чем * и префикса ++.
Ассоциативность postfix ++ слева направо.
Стандарт языка и большинство современных обработок описывают версии префикса и постфикса как различные операторы, неоднозначные по их положению относительно своего операнда. Остальная часть этого ответа объясняет, как это альтернативное описание того же самого.
Заметьте, что когда задействованы только унарные операторы, вопросы об ассоциативности возникают только между одним префиксом и одним постфиксным оператором с одинаковым приоритетом. Среди цепочки только префиксных или только постфиксных операций нет никакой двусмысленности в отношении того, как они ассоциируются. Например, учитывая - - x
, вы не можете сознательно сгруппировать его как (- -) x
. Единственная альтернатива - - (- x)
.
Далее обратите внимание, что все операторы с наивысшим приоритетом являются постфиксными унарными операторами, и что в K & R все операторы второго приоритета являются префиксными унарными операторами, кроме ambi-fix ++
и --
. Применяя ассоциативность справа налево к операторам второго приоритета, устраняет неоднозначность только выражений с постфиксным ++
или --
и префиксным унарным оператором и делает это в пользу постфиксного оператора. Это эквивалентно современному подходу различения постфиксных и префиксных версий этих операторов и присвоения более высокого приоритета постфиксным версиям.
Чтобы получить остальную часть пути к современному описанию, рассмотрим наблюдения, которые я уже сделал, что вопросы ассоциативности возникают для унарных операторов только тогда, когда префиксные и постфиксные операторы объединены в цепочку, и что все операторы с наивысшим приоритетом являются постфиксными унарными операторами. Различив постфиксы ++
и --
как отдельные операторы с более высоким приоритетом, чем их префиксные версии, один может поместить их в свой собственный уровень между другими постфиксными операторами и всеми префиксными операторами, но поместив их вместо этого на том же уровне со всеми остальными постфиксными операторами ничего не меняется в том, как интерпретируется любое выражение, и это проще. Вот как это обычно представляется в наши дни, в том числе на вашем втором ресурсе.
Что касается слева направо против ассоциативности справа налево, вопрос, опять же, спорный для уровня приоритета, содержащего только префиксные или только постфиксные операторы. Однако описание постфиксных операторов как ассоциирующих слева направо и префиксных операторов как ассоциированных справа налево согласуется с их семантическим порядком операций.