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

use*_*343 0 java operator-precedence short-circuiting

从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");
}
Run Code Online (Sandbox Code Playgroud)

这现在打印......什么都没有!因为前面的代码(少了一组括号)评估就像你说的那样,"如果(x> 3)不是真,并且(y <2)或者doStuff()的结果为真,那么打印true那么,如果(x> 3)不成立,那么在查看表达式的其余部分时没有意义"由于短路&&,表达式被评估为好像周围有括号(y <2)| 做东西().

在我的理解中,运营商&&||具有相同的优先级,并从左至右评估.因此,在这种情况下,(x > 3) && (y < 2)仍应首先评估表达式.请解释.

更新:我的错误.这确实是一个"|" 而不是"||".

Mak*_*oto 5

好吧,我不一定希望它能打印任何东西.x > 3 && y < 2对于给定的x和y值,条件为假.

我现在有一点时间反思运算符优先级,基本上,无论doStuff说什么(真或假),如果x > 3求值false,它都不会打印任何内容.

实际上,这个表达式:

(x > 3) && (y < 2) | doStuff()
Run Code Online (Sandbox Code Playgroud)

相当于:

(x > 3) && (y < 2 | doStuff())
Run Code Online (Sandbox Code Playgroud)

...并且由于x > 3给定x值为false ,因此整个表达式的计算结果为false.在这里,&&将调用表达式,而不需要调用doStuff.