2015-02-24 124 views
0

从凯茜塞拉利昂书上找到OCA/OCP Java SE 7级中的程序员我& II学习指南了解这个以下布尔表达式:需要帮助的if语句

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

这现在打印...什么都没有!因为前面的代码(少一个 括号)评估就好像你在说,“如果(x> 3) 不是真的,并且或者(y < 2)或doStuff()的结果为真, 那么如果(x> 3)不是真的,那么没有观察表达式的其余部分“因为短路& &, 表达式被评估为好像围绕着括号(y < 2)|做东西()。

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

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

+3

它是二进制还是“|”或者它是真的还是运营商“||”? – Necreaux 2015-02-24 21:35:58

+1

但是&&的优先级低于按位包含的OR。 – jdv 2015-02-24 21:38:36

+0

是的你是对的。你应该回答(而不是评论),那么我会选择你的回答。 – user1539343 2015-02-24 22:44:46

回答

5

那么,我不一定期望它打印任何东西。条件x > 3 && y < 2对于给定的x和y值是错误的。

我有现在一个时刻反思运算符优先级,基本上,不管是什么doStuff说(true或false),如果x > 3计算结果为false,它没有任何打印。

有效地,此表达式:

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

相当于:

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

...并且由于x > 3是为给定的值x假,则整个表达式评估为假。这里,&&将短路表达式,而不呼叫doStuff