我正在查看以下部分代码:
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)
答案 0 :(得分:3)
根据reference you give,&&
“比||
更紧密”(因为它具有更高的优先级),因此a && b || c
被解释为(a && b) || c
和a || b && c
为a || (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。