В C, как и в большинстве языков, постфиксные операторы связываются более тесно, чем префиксные операторы, а префиксные операторы связываются более тесно, чем бинарные операторы.(Есть исключения из второй части, но не на C.) Это обычно соответствует интуиции о значении выражений.
Например, почти все ожидают, что значение
-a[0]
«отрицательный элемент 0 массива a
», а не «элемент 0 массива -a
», особенно в таких языках, как C, где «массив -a
» не имеет смысла.Аналогичным образом,
-a++
имеет ожидаемое значение «отрицательное значение текущего значения a
, которое впоследствии увеличивается».Опять же, увеличение -a
не имеет смысла, поскольку -a
не является переменной.
Наивные интуиции могут не работать так же хорошо с более неясными операторами, поэтому полезно поддерживать согласованность.Хотя вполне возможно, что может существовать префиксный оператор, который почти всегда необходимо заключать в круглые скобки, поскольку он недостаточно тесно связан, что делает этот оператор исключением из общего правила, что, скорее всего, вызовет больше сюрпризов, чем решит, и малоязыки выбирают этот путь.
Таким образом, префиксы и постфиксы ++
и --
имеют синтаксис, определенный этим общим правилом.Тем не менее, по крайней мере, в C ошибочно применять оба к одному и тому же операнду (++a--
), потому что значение, возвращаемое версиями до и после исправления, не является lvalue, в то время как операнд долженбыть lvalue.В этом смысле конкретный случай сравнения приоритетов префикса и постфикса ++
и --
никогда не обнаруживается в правильной программе.Но другие комбинации префиксных и постфиксных операторов делают, и уровни приоритета должны применяться однородно.
В другом смысле объявления приоритетов и ассоциативности являются избыточными.Синтаксически бессмысленно говорить об ассоциации между двумя префиксными операторами или между двумя постфиксными операторами.И если префиксные и постфиксные операторы имеют разные уровни приоритета, также бессмысленно говорить об ассоциативности между префиксом и постфиксным оператором.Таким образом, ассоциативность не имеет значения.
Однако вы можете расширить понятие ассоциативности и сказать, что все унарные операторы имеют одинаковый приоритет, и все они ассоциируются справа.Это на самом деле даст правильный синтаксический анализатор, который использовался в определении B (предшественник Си).Но это действительно слишком запутанно для большинства людей, не привыкших к грамматическому анализу.