Как упоминалось ранее в этой главе, логические операции “ИЛИ” и “И” в C++ обладают более низким приоритетом, чем операции сравнения. Это значит, что такое выражение, как
х > 5 && х < 10
интерпретируется следующим образом:
(х > 5) && (х < 10)
С другой стороны, операция “НЕ” (!) имеет более высокий приоритет, чем любая арифметическая операция и операция сравнения. Таким образом, для отрицания выражения его необходимо заключить в скобки:
! (х > 5) // равно false, если х больше 5
!х > 5 // равно true, если !х больше 5
Кстати, результатом второго из приведенных выражений всегда будет false, т.к. !х принимает значения true или false, что преобразуется, соответственно, в 1 и 0.
Логическая операция “И” имеет более высокий приоритет, чем логическая операция “ИЛИ”. Поэтому следующее выражение:
age > 30 && age <45 | | weight > 300
означает вот что:
(age > 30 && age < 45) | | weight > 300
Здесь первое условие говорит о том, что возраст должен быть от 31 до 44 лет включительно, а второе — что вес должен быть больше 300 (фунтов). Все выражение будет истинным, если истинно одно из выражений или оба сразу.
Разумеется, можно использовать скобки, чтобы явно указать программе, как следует интерпретировать выражение. Например, предположим, что вы хотите использовать && для комбинирования условий о том, что возраст (аде) должен быть больше 50 или вес (weight) — больше 300, с условием, что размер пожертвования (donation) должен быть больше 1000. Для этого часть “ИЛИ” потребуется поместить в скобки:
(аде >50 | | weight > 300) && donation > 1000
Иначе компилятор скомбинирует условие weight с условием donation, вместо того чтобы скомбинировать его с условием age.
Хотя правила приоритетов операций C++ часто позволяют писать составные выражения без использования скобок, все же проще всегда применять скобки для группирования проверок, независимо от того, нужны они или нет. Это улучшает читабельность кода, исключает неправильное понимание порядка приоритетов и снижает вероятность ошибки из-за того, что вы не помните точно правил приоритетов.
C++ гарантирует, что когда программа вычисляет логическое выражение, то делает это слева направо, и прекращает вычисление, как только ответ становится ясен.