Разъяснение того, почему этот код приводит к ложным и не соответствует действительности - PullRequest
0 голосов
/ 12 мая 2019

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

boolean x = false;
boolean y = true;
boolean z = true;

System.out.println((!x || y && !z));

Я ожидал, что напечатанная строка будет ложной, но правильный ответ верен.

1 Ответ

5 голосов
/ 12 мая 2019

Факторы, которые вступают в игру, - это приоритет операторов, оценка слева направо и особый характер «&&» и «||» «короткого замыкания».

'и' крепче связываетчем «или».

Во-первых, приоритет оператора означает, что выражение эффективно

  (  (!x) || (y && !z) );

Учитывая выполнение короткого замыкания '||', как только мы узнаем, что !x верно, правая частьсторона не получает оценку.

Я написал этот хак, чтобы распечатать каждый термин, как он был оценен:

static boolean P(String s, boolean x) { System.out.println(" "+s); return x; }

, а затем заменил каждый логический термин 'b' на вызов P («b», b):

{
   ... same as before...
   System.out.println( P("!x",!x) || (P("y",y) && P("!z",!z)));
}

приводит к выводу

   !x
  true

примечание: ничего не связано с напечатанным y или z.

...