Приоритет оператора в C - "как указано синтаксисом", что означает на простом английском языке, что каждая подглава стандартной главы 6.5 является одной группой операторов.Приоритет: первая группа, наивысший приоритет:
6.5 Выражения
6.5.1 Первичные выражения
6.5.2 Постфиксные операторы
6.5.3 Унарные операторы
6.5.4 Операторы приведения
6.5.5 Мультипликативные операторы
6.5.6 Аддитивные операторы
6.5.7 Битовые операторы сдвига
6.5.8 Реляционные операторы
6.5.9 Операторы равенства
6.5.10 Битовый оператор И
6.5.11 Битовый оператор ИЛИ
6.5.12 Битовый оператор ИЛИ
6.5.13 Логический оператор И
6.5.14 Логический оператор ИЛИ
6.5.15Условный оператор
6.5.16 Операторы присваивания
6.5.17 Оператор запятой
Как видите, логическое И является отдельной группой от логического ИЛИ.В стандарте оно появляется раньше, поэтому оно имеет более высокий приоритет.
Если бы они были «в одной строке», то есть если бы они имели одинаковый приоритет, то ассоциативность операторов определяла бы, каким образом выражение должно бытьразобран.a || b || c
должен быть проанализирован как (a || b) || c
, потому что ассоциативность этой группы операторов слева направо.
Обратите внимание, что приоритет оператора только указывает, какие операнды принадлежат каким операторам.Он не определяет порядок оценки (выполнения), который является другим, но связанным термином.
В вашем случае приоритет оператора указывает, что Exp1 || Exp2 && Exp3
эквивалентно
Exp1 || (Exp2 && Exp3)
Порядок вычисления оператора ||
, в частности, является особым случаем, он должен вычислять Exp1
сначала полностью, и, если оно ложно, и только потом, вычислите правый оператор.
Обычно в C порядок вычисления операндов не указан.Возьмем, к примеру, Exp1 | Exp2
, где не существует специального правила порядка оценки.Затем сначала можно оценить Exp1
или Exp2
.