小疑問。爲什麼是以下代碼1
的輸出?爲什麼不是3
?爲什麼不評估&&操作符的右側?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
小疑問。爲什麼是以下代碼1
的輸出?爲什麼不是3
?爲什麼不評估&&操作符的右側?
int i = 0;
boolean t = true, f = false, b;
b = (t && ((i++) == 0));
b = (f && ((i+=2) > 0));
System.out.println(i);
條件 - 和運營商 - &&
- 是短路。如果左操作數爲假,它不評估右操作數。這就是爲什麼((i+=2) > 0)
從不評價,並i
保持爲1
的& &操作就像&(§15.22.2),但評估其右邊的操作數只有當其左手操作數的值爲真。
這裏的情況
b = (f && ((i+=2) > 0)); // here f is false
現在false && anything
是false
。 &&
是短路操作人員,所以它不會評估((i+=2)
部分,因爲左邊的是false
。所以i
仍將1
只是試圖改變
b = (f && ((i+=2) > 0));
要
b = (f & ((i+=2) > 0));// non short circuit
現在你會得到3
。
這是short circuit
和non short circuit
AND
的兩種不同行爲。
欲瞭解更多info。
非常感謝... – Leo 2014-10-20 07:57:59
@Leo歡迎您 – 2014-10-20 07:58:55
同意發佈的答案爲&&
負責此操作。
你應該在這裏指出,你的發言b = (t && ((i++) == 0));
相當於
if(t){
if(i++==0){
b=true;
}
}
和第二條語句b = (f && ((i+=2) > 0));
相當於,
if(f==true){
i=i+2;
if(i>0){
b=true;
}
}
例如:
if(p && q){
// do something
}
如果p
正在評估因爲&&
(p
和q
必須爲真)的定義,所以不需要評估其餘的聲明。如果p
不是真的,那麼該陳述不可能是真實的。
你沒有想到這個問題是重複的嗎? – Raedwald 2014-10-22 07:01:24
@Raedwald我沒有時間搜索其他人提出的問題的重複,所以我只關閉重複,如果我知道這是一個重複的具體問題。否則,回答往往需要更少的時間。 – Eran 2014-10-22 07:04:38