需要帮助理解 if 语句中的以下布尔表达式

Posted

技术标签:

【中文标题】需要帮助理解 if 语句中的以下布尔表达式【英文标题】:Need help understanding this following boolean expression in an if statement 【发布时间】:2015-04-26 17:21:39 【问题描述】:

从 Kathie Sierra 的 OCA/OCP Java SE 7 程序员 I 和 II 学习指南一书中找到:

int x = 2;
int y = 5;
if ((x > 3) && (y < 2) | doStuff()) 
    System.out.println("true");

现在打印...什么都没有!因为前面的代码(少了一个 一组括号)的计算就像你在说“如果 (x > 3) 不为真,并且 (y 3) 不是真的,那么看 表达式的其余部分“由于短路 &&, 表达式被评估,就好像 (y

据我了解,运算符&amp;&amp;|| 具有相同的优先级,并且从左到右进行评估。所以在这种情况下,表达式(x &gt; 3) &amp;&amp; (y &lt; 2) 仍应首先计算。请解释一下。

更新:我的错误。确实是一个“|”而不是“||”。

【问题讨论】:

是二进制还是“|”还是一个真或运算符“||”? 但是 && 的优先级低于按位包含 OR。 是的,你是对的。你应该回答(而不是评论)然后我会选择你的作为答案。 【参考方案1】:

好吧,我不一定希望它打印任何东西。对于给定的 x 和 y 值,条件 x &gt; 3 &amp;&amp; y &lt; 2 为 false。

我现在有时间思考运算符的优先级,基本上,无论doStuff 说什么(真或假),如果x &gt; 3 的计算结果为false,它不会打印任何东西。

实际上,这个表达式:

(x > 3) && (y < 2) | doStuff()

相当于:

(x > 3) && (y < 2 | doStuff())

...由于x &gt; 3 对于给定的x 值是假的,因此整个表达式的计算结果为假。在这里,&amp;&amp; 将短路表达式,而不调用 doStuff

【讨论】:

以上是关于需要帮助理解 if 语句中的以下布尔表达式的主要内容,如果未能解决你的问题,请参考以下文章

关于java中的if语句

Java 分支结构

Go语言第五篇:Go条件语句

Java 分支结构 - if...else/switch

Java 分支结构 - if...else/switch

Java 分支结构 - if...else/switch