以下代码导致错误。谁能向我解释为什么?我在使用真值表时遇到一些麻烦。我是Java的初学者,在此先感谢您的帮助。
boolean x = false;
boolean y = true;
boolean z = true;
System.out.println((!x || y && !z));
我希望打印的行是错误的,但正确答案是正确的。
答案 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相关的内容。