2014-10-20 96 views
1

小疑問。爲什麼是以下代碼1的輸出?爲什麼不是3爲什麼不評估&&操作符的右側?

int i = 0; 
boolean t = true, f = false, b; 
b = (t && ((i++) == 0)); 
b = (f && ((i+=2) > 0)); 
System.out.println(i); 

回答

6

條件 - 和運營商 - && - 是短路。如果左操作數爲假,它不評估右操作數。這就是爲什麼((i+=2) > 0)從不評價,並i保持爲1

JLS 15.23

的& &操作就像&(§15.22.2),但評估其右邊的操作數只有當其左手操作數的值爲真。

+0

你沒有想到這個問題是重複的嗎? – Raedwald 2014-10-22 07:01:24

+0

@Raedwald我沒有時間搜索其他人提出的問題的重複,所以我只關閉重複,如果我知道這是一個重複的具體問題。否則,回答往往需要更少的時間。 – Eran 2014-10-22 07:04:38

2

這裏的情況

b = (f && ((i+=2) > 0)); // here f is false 

現在false && anythingfalse&&是短路操作人員,所以它不會評估((i+=2)部分,因爲左邊的是false。所以i仍將1

只是試圖改變

b = (f && ((i+=2) > 0)); 

b = (f & ((i+=2) > 0));// non short circuit 

現在你會得到3

這是short circuitnon short circuitAND的兩種不同行爲。

欲瞭解更多info

+0

非常感謝... – Leo 2014-10-20 07:57:59

+0

@Leo歡迎您 – 2014-10-20 07:58:55

2

同意發佈的答案爲&&負責此操作。

你應該在這裏指出,你的發言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; 
     } 
    } 
0

例如:

if(p && q){ 
// do something 
} 

如果p正在評估因爲&&pq必須爲真)的定義,所以不需要評估其餘的聲明。如果p不是真的,那麼該陳述不可能是真實的。

相關問題