说明此代码为什么会导致错误而非真实

时间:2019-05-12 20:55:11

标签: java truthtable

以下代码导致错误。谁能向我解释为什么?我在使用真值表时遇到一些麻烦。我是Java的初学者,在此先感谢您的帮助。

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

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

我希望打印的行是错误的,但正确答案是正确的。

1 个答案:

答案 0 :(得分:5)

在这里起作用的因素是运算符的优先级,从左到右的评估以及'&&'和'||'的特殊“短路”性质。

'和'的绑定比'或'更紧密。

首先,运算符优先级表示表达式有效

  (  (!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相关的内容。