логические операторы — относительно порядка приоритета (c ++)

Я читаю на C ++ и перехожу к разделу «Порядок приоритетов».

Есть пример, который я не совсем понимаю, а именно:

11 > 5 || 6 < 15 && 7 >= 8

«Это логическое выражение дает разные результаты, в зависимости от того, || или && оценивается первым. Если || оценивается первым, выражение оценивается как ложное. Если && оценивается первым, выражение оценивается как true. «

Я был бы признателен, если бы кто-то мог объяснить, почему это будет правдой / ложью в любой ситуации. Спасибо за ваше время.

1

Решение

Если || оценивается первым:

(11 > 5 || 6 < 15) && 7 >= 8
(true || false) && false
true && false
false

Если && оценивается первым:

11 > 5 || (6 < 15 && 7 >= 8)
true || (true && false)
true || false
true
3

Другие решения

Приоритет && а также || Операторы определяются языком, поэтому «если» в цитируемом тексте не имеет особого смысла.

Фраза «оценивается первым» вводит в заблуждение. Важен не порядок, в котором оцениваются подвыражения, а то, как подвыражения связаны с || а также && операторы.

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 возможных заказов с точно таким же конечным результатом.

3

&& имеет более высокий приоритет, чем ||так что не должно быть if,

11>5 оценивается как истина, и это значение всего выражения. Второй операнд || оператор, который 6 < 15 && 7 >= 8, не будет оценен.

1

Если || оценивается первым, вы получаете ((11 > 5) || (6 < 15)) && (7 >= 8) == (true || true) && false == true && false == false,

Если && оценивается первым, у вас есть (11 > 5) || ((6 < 15) && (7 >= 8)) == true || (true && false) == true || true == true,

0

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

Тогда мы получим две формы записей

( a || b ) && c

а также

a || ( b && c )

В первом случае мы имеем фактически два операнда оператора &&, Если хотя бы один операнд является ложным, тогда все выражение также равно ложному. Теперь вернемся к исходному выражению. Как с соответствует

7 >= 8

Это равно ложному, поэтому все выражение ( a || b ) && c равно ложному.

Во втором случае у нас также есть два операнда оператора ||. Если хотя бы один операнд равен true, тогда все выражение равно true. Как соответствует оригинальному выражению

11 > 5

что равно истине, то все выражение a || ( b && c ) также равно истине.

0