Я читаю на C ++ и перехожу к разделу «Порядок приоритетов».
Есть пример, который я не совсем понимаю, а именно:
11 > 5 || 6 < 15 && 7 >= 8
«Это логическое выражение дает разные результаты, в зависимости от того, || или && оценивается первым. Если || оценивается первым, выражение оценивается как ложное. Если && оценивается первым, выражение оценивается как true. «
Я был бы признателен, если бы кто-то мог объяснить, почему это будет правдой / ложью в любой ситуации. Спасибо за ваше время.
Если ||
оценивается первым:
(11 > 5 || 6 < 15) && 7 >= 8
(true || false) && false
true && false
false
Если &&
оценивается первым:
11 > 5 || (6 < 15 && 7 >= 8)
true || (true && false)
true || false
true
Приоритет &&
а также ||
Операторы определяются языком, поэтому «если» в цитируемом тексте не имеет особого смысла.
Фраза «оценивается первым» вводит в заблуждение. Важен не порядок, в котором оцениваются подвыражения, а то, как подвыражения связаны с ||
а также &&
операторы.
11 > 5 || 6 < 15 && 7 >= 8
Поскольку реляционные операторы имеют более высокий приоритет, чем (т. Е. Связываются более тесно, чем), ||
а также &&
операторы, приведенные выше эквивалентны:
(11 > 5) || (6 < 15) && (7 >= 8)
что в свою очередь эквивалентно:
true || true && false
Как это происходит, &&
имеет более высокий приоритет, чем ||
так что вышеизложенное эквивалентно:
true || (true && false)
который сводится к:
true || false
который
true
С другой стороны, если ||
имел более высокий приоритет, чем &&`тогда
true || true && false
будет эквивалентно
(true || true) && false
или же
true && false
который
false
Важно знать, что здесь действительно нет выбора. Язык однозначно утверждает, что &&
связывает более плотно, чем ||
так что нет никакой возможности 11 > 5 || 6 < 15 && 7 >= 8
может оценить false
,
Бывает, что, в отличие от большинства операторов, операнды &&
а также ||
операторы оцениваются в строгом порядке слева направо, при этом правый операнд вообще не оценивается, если значение левого операнда достаточно для определения результата. Это называется «оценкой короткого замыкания» и позволяет писать такие вещи, как:
if (ptr != NULL && *ptr == 42)
без страха разыменования нулевого указателя. Но это не имеет значения в данном конкретном случае, поскольку ни одно из подвыражений не имеет побочных эффектов. Три подвыражения 11 > 5
, 6 < 15
, а также 7 >= 8
может быть оценен в любом из 6 возможных заказов с точно таким же конечным результатом.
&&
имеет более высокий приоритет, чем ||
так что не должно быть if
,
11>5
оценивается как истина, и это значение всего выражения. Второй операнд ||
оператор, который 6 < 15 && 7 >= 8
, не будет оценен.
Если ||
оценивается первым, вы получаете ((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false
,
Если && оценивается первым, у вас есть (11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true
,
Я собираюсь объяснить следующим образом. Давайте забудем об оригинальном выражении и будем использовать символические имена , б а также с вместо отношений.
Тогда мы получим две формы записей
( a || b ) && c
а также
a || ( b && c )
В первом случае мы имеем фактически два операнда оператора &&, Если хотя бы один операнд является ложным, тогда все выражение также равно ложному. Теперь вернемся к исходному выражению. Как с соответствует
7 >= 8
Это равно ложному, поэтому все выражение ( a || b ) && c
равно ложному.
Во втором случае у нас также есть два операнда оператора ||. Если хотя бы один операнд равен true, тогда все выражение равно true. Как соответствует оригинальному выражению
11 > 5
что равно истине, то все выражение a || ( b && c )
также равно истине.