java - 澄清为什么此代码导致错误而不正确
问题描述
以下代码导致错误。谁能向我解释为什么?我在理解使用真值表时遇到了一些麻烦。我是java初学者,提前感谢您的帮助。
boolean x = false;
boolean y = true;
boolean z = true;
System.out.println((!x || y && !z));
我预计打印的行是错误的,但正确的答案是正确的。
解决方案
这里发挥作用的因素是运算符优先级、从左到右的评估,以及 '&&' 和 '||' 的特殊“短路”性质。
'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 无关。
推荐阅读
- scala - 加特林进纸器价值不足
- angular - 视频无法在使用 Angular 的 iOS 移动 Safari 中播放
- excel - 使用 vba 将数据从一个工作簿传输到另一个工作簿
- java - 如何使 Spring Boot 应用程序可以通过服务器的外部 IP 地址访问?
- xpath - 无法检查注销按钮这个标签
- graphviz - Vizrt API JSON 数据与图形集成
- javascript - 在 Javascript 代码中包含 PHP 的正确方法
- electron - Electron - 应用程序在加载期间抛出错误
- ruby-on-rails - 如何修复“您的 Ruby 版本是 2.3.3,但您的 Gemfile 指定了 2.5.2”
- firebase - 归档的动态链接在哪里?