Порядок приоритета бинарных операторов C++
-
02-07-2019 - |
Вопрос
В каком порядке проверяются следующие параметры (в C++)?
if (a || b && c)
{
}
Я только что увидел этот код в нашем приложении и мне он не нравится. Я хочу добавить несколько скобок, чтобы уточнить порядок.Но я не хочу добавлять скобки, пока не узнаю, что добавляю их в нужном месте.
Редактировать:Принятый ответ и последующие действия
Эта ссылка содержит дополнительную информацию, но не совсем понятно, что она означает.Кажется || и && являются одинаковым приоритетом, и в этом случае они оцениваются слева направо.
Решение
Другие советы
[http://www.cppreference.com/wiki/operator_precedence] (Найдено путем поиска в Google «Приоритет операторов C++»)
Эта страница говорит нам, что && в группе 13 имеет более высокий приоритет, чем || В группе 14, таким образом, выражение эквивалентно || (До нашей эры).
К сожалению, статья в Википедии [http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence] не согласен с этим, но поскольку у меня на столе лежит стандарт C89 и он согласуется с первым сайтом, я собираюсь пересмотреть статью в Википедии.
&& (boolean и) имеет более высокий приоритет, чем || (логический или).Таким образом, следующие элементы идентичны:
a || b && c
a || (b && c)
Хорошее мнемоническое правило — помнить, что «И» похоже на умножение, а «ИЛИ» — на сложение.Если заменить 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)
Чтобы ответить на продолжение:очевидно, что таблица в MSDN испорчена, возможно, кто-то не смог создать достойную таблицу HTML (или использовал инструмент Microsoft для ее создания!).
Я полагаю, что это должно быть больше похоже на таблицу Википедии, на которую ссылается Родриго, где у нас есть четкие подразделы.
Но ясно, что принятый ответ правильный, как -то у нас есть тот же приоритет с && и || чем с * и +, например.
Фрагмент, который вы дали, для меня ясен и однозначен, но, полагаю, добавление скобок тоже не помешало бы.
Я не уверен, но вам должно быть легко это узнать.
Просто создайте небольшую программу с оператором, который выводит истинное значение:(истина || ложь && правда)
Если результат правда, то || имеет более высокий приоритет, чем &&, если это Falase, это наоборот.