2012-03-19 73 views
4

我無法理解以下代碼塊。Java前後遞增

int count = 0; 
    for (int i = 0; i < 3; i++){ 
     count += (count++); 
     System.out.println("count = " + count); 
     System.out.println("i = " + i); 
    } 

我的理解是,循環運行三次預成型以下

count = count + count 
count = 1 + count 

這意味着以下爲計數最初是0:

count = 0 + 0 
count = 1 + 0 = 1 
count = 1 + 1 = 2 
count = 1 + 2 = 3 
count = 3 + 3 = 6 
count = 6 + 1 = 7 

的輸出之下,計數打印爲0.

count = 0 
    i = 0 
    count = 0 
    i = 1 
    count = 0 
    i = 2 

有人可以向我解釋這個嗎? 感謝

+4

我明白,對於作業/代碼理解問題,這個問題是有道理的。但是在生產系統中,沒有人應該寫出像count + =(count ++);'這樣的混淆行。 – 2012-03-19 14:54:35

+1

@MikeRyan完全同意。如果有人問我那條線是幹什麼的,而且我心情不好,我會回答「它會讓你的合併建議被拒絕。」 – yshavit 2012-03-19 14:58:40

+0

在FindBugs(或類似的開源工具)中是否有一條規則可以解決這個問題? – 2013-06-14 12:29:29

回答

3
count += (count++); 

相當於

in tmp = count;  // right hand side of += 
count = count + 1; // the count++ 
count = tmp + tmp; // executing count += tmp 

正如你可以看到count = count + 1沒有任何效果,因爲count值在最後一行被覆蓋,而如果count最初是0,那麼結果顯然是count = 0 + 0 :-)

+1

但tmp = 1在這裏?應該是int tmp = count + 0嗎? – oers 2012-03-19 14:50:07

+1

我認爲你的第一行應該是'int tmp = count + count;' – ccoakley 2012-03-19 14:51:07

+2

我最喜歡這個例子,不管tmp = count + 1中的錯誤。 – pillsdoughboy 2012-03-19 14:52:37

7

混亂的部分是這條線 -

count+ = (count++); 

這實際上是這樣做的 -

count = count + (count++); 

所以,(count++)了該方程的數值爲0,後增量發生後,但count得到分配0,所以後增量被扔掉。

這發生3次。