Java运营商优先

时间:2015-02-10 14:46:22

标签: java

我正在查看以下部分代码:

int a =2;
int b =3;
int c =4;
int d =4;
System.out.println(a==2 || (b==3&&c==4) && d==5);
System.out.println(d==5 && (b==3&&c==4) || a==2);

根据http://bmanolov.free.fr/javaoperators.php我希望&&先执行||,所以逻辑上应该看起来像

if(d==5&&((b==3&&c==4)||a==2)) 
if((a==2||(b==3&&c==4))&&d==5) 

并且是假的,但我在上述两种情况下都是如此。

我错过了什么?


更新: 请不要建议真实/真实的结果:

d==5&&((b==3&&c==4)||a==2)返回false

d==5&&(b==3&&c==4)||a==2返回true

我的问题是根据运营商的优先级我相信

d==5&&(b==3&&c==4)||a==2应解释为

d==5&&((b==3&&c==4)||a==2)

2 个答案:

答案 0 :(得分:3)

根据reference you give&&“比||更紧密”(因为它具有更高的优先级),因此a && b || c被解释为(a && b) || ca || b && ca || (b && c)。因此,在所有情况下,您都a==2制作了所有内容true

特别是,您的信念表达在

  

我的问题是根据运营商的优先级我相信

     

d==5&&(b==3&&c==4)||a==2应解释为

     

d==5&&((b==3&&c==4)||a==2)

错了。

答案 1 :(得分:2)

在这部分:

if(a==2||(b==3&&c==4)&&d==5){

它会评估a==2,并会说是a是2,所以无论右边是什么,都会打印出来。

在其他情况下:

if(d==5&&((b==3&&c==4)||a==2)) 

它会评估d==5这是假的,然后会立即看到有一个或条件(将跳过&&条件)并且会看到a为2并且将输入if和将打印为true。 / p>

简而言之,||&&被称为短路操作,可以评估全部或全部。这意味着如果你有condition1 || condition2,当且仅当condition1失败时,它将评估condition2。

如果你有condition1 && condition2,当且仅当条件1为真时,它将评估condition2。