【问题标题】:Clarification on why this code is resulting in false and not true澄清为什么此代码导致错误而不正确
【发布时间】:2019-09-29 21:16:29
【问题描述】:

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

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

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

我预计打印的行是假的,但正确的答案是真的。

【问题讨论】:

  • 以下代码结果为假——不,它打印为真。

标签: java truthtable


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2019-08-31
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多