首页 > 解决方案 > 澄清为什么此代码导致错误而不正确

问题描述

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

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

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

我预计打印的行是错误的,但正确的答案是正确的。

标签: javatruthtable

解决方案


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

'and' 比 'or' 绑定得更紧密。

首先,运算符优先级意味着表达式有效

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

鉴于“||”的短路执行,一旦我们知道这!x是真的,右侧就不会被评估。

我写了这个 hack 来打印出每个被评估的术语:

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 无关。


推荐阅读