2014-08-28 50 views
4

&&的优先级应该有更高的优先级比||的Java布尔

int a = 10; 
    System.out.println(a==10 || --a==9 && a==8); 
    System.out.println(a); 

此打印正确的,10它似乎只检查了第一部分,如果其真正的第二个根本不会执行。

如果我做a==9那么第二部分似乎评估和打印9.有人可以解释为什么会发生这种情况吗?是不是&&应该首先评估?

编辑:我明白了。 a==10 || --a==9 && a==8转换成(a==10) || (a==9 && a==8)因此,如果第一个评估为真,它会短路。谢谢你的帮助。

+0

没有更高的优先级,它只是从左转到右.. – gtgaxiola 2014-08-28 13:09:13

+0

@gtgaxiola小心,当你说没有优先级。如果没有优先权。如果没有优先级,表达式将评估为true。 – Cruncher 2014-08-28 13:11:53

+0

@Cruncher很好抓.. – gtgaxiola 2014-08-28 13:12:54

回答

4
System.out.println(a==10 || --a==9 && a==8); 

等于

System.out.println((a==10) || (((--a)==9) && (a==8))); 

的Java评估||第一。发现,左侧部分(一== 10)true并得出没有母校什么是正确的部分结果无论如何会true

PS:这是常见的伎俩写

if(obj != null && obj.isSomething) { ... } 

到防止NPE

3

如果您评估(a==10) || (b == 9)(这是一个OR操作), 如果第一条是true,那么整个表达式必须是true(因为它是OR)和第二条将不进行优化的原因被执行。

代码是从左至右执行的,所以你会打第一TRUE因此整个说明会TRUE,和你的声明的剩余部分将不被执行

如果你的第一句话是false,然后只有第二个条款才会被评估。

如果使用(a==10) | (b == 9)这两个子句都将被评估。

如果你想成为某些你符的优先级,你应该用括号

3

看表情如树木这是非常有用的顺序。

a==10 || --a==9 && a==8 

在这个例子中,树的顶端是OR。左边的分支是EQUALS,右边的分支是AND,其左右分支都是EQUALS。

因为我在图形可怕,它看起来是这样的:

OR 
/ \----- 
    =   \ 
/\   AND 
a 10  / \ 
      =  = 
     /\ /\ 
     --a 9 a 8 

的“优先级”,你这个树谈,订货。但它不一定会改变执行顺序。因为在这种情况下,如果第一个分支是真的,这是真的,所以不需要检查第二个分支。

0
|| and && are short circuit operators they don't evaluate the right hand side expression 
if the left hand side is true. 
So (--a) is never executed as (a==10) left hand side is true 
Therefore the value of a remains same. 
**& and | operators that always evaluate both sides.