Существует четкое правило приоритета, которое неопровержимо.Правило настолько ясно, что для строго типизированной системы (думаю, Паскаль) неправильный приоритет даст явные недвусмысленные синтаксические ошибки во время компиляции.Проблема с C состоит в том, что, поскольку его система типов является laissez faire, ошибки оказываются более логичными ошибками, приводящими к ошибкам, а не ошибкам, которые можно отловить во время компиляции.
Правило
Пусть○ □ два оператора с типом
○: α × α → β
□: β × β → γ
, а α и γ - разные типы.
Тогда
x ○ y □ z может означает только (x ○ y) □ z с присвоением типа
x: α, y: α, z: β
, тогда какx ○ (y □ z) будет ошибкой типа, потому что ○ может принимать только α, тогда как правильное подвыражение может создавать только γ, который не является α
Теперь позволяет
Применить этоC
По большей части C понимает правильно
(==): число × число → логическое значение
(&&): логическое значение логическое значение логическое значение логическое значение логическое значение * логическое значение
поэтому && должно быть ниже == и это так
Аналогично
(+): число × число → число
(==): число × число → логическое значение
и так (+) должно быть выше (==), что еще раз правильно
Однако в случае побитовых операторов
символ & / |из двух битовых комбинаций, иначе числа производят число, то есть
(&), (|): число × число → число
(==): число × число → логическое значение
И так типичнозапрос маски например.x & 0x777 == 0x777
может иметь смысл только в том случае, если (&) рассматривается как арифметический оператор, т. Е. Выше (==)
C ставит его ниже, что в свете приведенных выше правил типов неверно
Конечно, я выразил вышеизложенное в терминах математики / вывода типов
В более прагматичных терминах C x & 0x777 == 0x777
естественно группируется как x & (0x777 == 0x777)
(при отсутствии явных скобок)
Когда такая группировка может иметь законное использование?
Я (лично) не верю, что существует какое-либо неофициальное утверждение Денниса Ричи
о том, что эти прецеденты неверны,более формальное обоснование