Сделайте '&&' и '||'лежать в одной строке в приоритетном операторе или в другой строке? - PullRequest
0 голосов
/ 05 июня 2018

Если они лежат в разных строках, то в Exp1 || Exp2 && Exp3, (Exp2 && Exp3) не должны оцениваться первыми, поскольку && имеет более высокий приоритет, чем ||?

И, если они лежат вв этом же ряду порядок выполнения не должен быть сначала (Exp1 || Exp2), а затем && Exp3, поскольку оба остаются ассоциативными?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Приоритет оператора в 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.

0 голосов
/ 05 июня 2018

Exp1 || Exp2 && Exp3 равно сгруппировано как Exp1 || (Exp2 && Exp3), из-за приоритета оператора .

Обратите внимание, что (Exp2 && Exp3) только на самом деле оценивается если Exp1 равно 0, а затем Expr3 равно только вычислено, если Exp2 равно 1. Это называется короткое замыкание .

Их нахождение в другом «ряду» не имеет значения.

...