C ++ Бинарные операторы, порядок приоритета - PullRequest
4 голосов
/ 22 сентября 2008

В каком порядке тестируются следующие параметры (в C ++)?

if (a || b && c)
{
}

Я только что видел этот код в нашем приложении и ненавижу его, я хочу добавить несколько скобок, чтобы просто уточнить порядок. Но я не хочу добавлять скобки, пока не узнаю, что добавляю их в нужном месте.

Редактировать: Принятый ответ и продолжение

Эта ссылка содержит больше информации, но не совсем понятно, что это значит. Кажется, || и && имеют одинаковый приоритет, и в этом случае они оцениваются слева направо.

http://msdn.microsoft.com/en-us/library/126fe14k.aspx

Ответы [ 5 ]

7 голосов
/ 22 сентября 2008

[http://www.cppreference.com/wiki/operator_precedence] (найдено путем поиска в Google "приоритета оператора C ++")

Эта страница сообщает нам, что && в группе 13 имеет более высокий приоритет, чем || в группе 14, поэтому выражение эквивалентно || (b && c).

К сожалению, статья в Википедии [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] не согласна с этим, но, поскольку у меня на столе стоит стандарт C89 и он согласуется с первым сайтом, я собираюсь пересмотреть статью в Википедии.

4 голосов
/ 22 сентября 2008

С здесь :

a || (b && c)

Это приоритет по умолчанию.

2 голосов
/ 22 сентября 2008

&& (логическое И) имеет более высокий приоритет, чем || (логическое ИЛИ). Поэтому следующие идентичные:

a || b && c
a || (b && c)

Хорошее мнемоническое правило - помнить, что AND похоже на умножение, а OR - на сложение. Если мы заменим AND на * и OR на +, мы получим более знакомый эквивалент:

a + b * c
a + (b * c)

На самом деле, в булевой логике И и ИЛИ действуют подобно этим арифметическим операторам:

a  b   a AND b   a * b   a OR b   a + b
---------------------------------------
0  0      0        0       0        0
0  1      0        0       1        1
1  0      0        0       1        1
1  1      1        1       1        1 (2 really, but we pretend it's 1)
0 голосов
/ 22 сентября 2008

Чтобы ответить на следующий вопрос: очевидно, что таблица в MSDN испорчена, возможно, кем-то, кто не может сделать достойную таблицу HTML (или использует инструмент Microsoft для ее создания!). Я полагаю, это должно выглядеть больше как таблица Википедии, на которую ссылается Родриго, где у нас есть четкие подразделы.
Но ясно, что принятый ответ правильный, почему-то у нас одинаковый приоритет с && и || чем с * и +, например.
Фрагмент, который вы дали, ясен и однозначен для меня, но я полагаю, что добавление скобок также не повредит.

0 голосов
/ 22 сентября 2008

Я не уверен, но вам должно быть легко узнать.

Просто создайте небольшую программу с утверждением, которое выводит значение истинности: (true || false && true)

Если результат верен, то || имеет более высокий приоритет, чем &&, если это false, то наоборот.

...