2011-05-27 73 views
5

我在java中有一個程序..我很困惑輸出。Java中的輸出差異

public static void main(String args[]) 
{ 
     int n=0; 
     for(int m=0; m<5;m++) 
     { 
      n=n++; 
      System.out.println(n); 
     } 
} 

這裏輸出是0 0 0 0 0

但是,如果我寫,

public static void main(String args[]) 
{ 
     int n=0; 
     for(int m=0; m<5;m++) 
     { 
      n++; 
      System.out.println(n); 
     } 
} 

然後輸出爲1 2 3 4 5

爲什麼它是未來這樣? ??

+0

希望.NET Reflector存在,我可以看到IL生成的代碼。 C#中的類似行爲。 ':)' – 2011-05-27 05:25:04

回答

13

因爲,在第一個片段中,n++解析爲n之前的的增量。所以,當你這樣做:

n = n++; 

節省n,然後遞增,然後寫保存的值回n

在第二個片段中,該分配沒有發生,所以增量「堅持」。

操作的人如下,以行動從最裏面的人物[ ]到最外面的是順序:

[n = [[n]++]]     [[n]++] 
- current n (0) saved.   - current n (0) saved. 
- n incremented to 1.   - n incremented to 1. 
- saved n (0) written to n.  - saved n (0) thrown away. 

如果你想增加n,你應該只使用n = n + 1;n++;

+0

那麼爲什麼在第一種情況下n(0)不會被丟棄? – 2011-05-27 05:25:40

+0

@Arindam:因爲你正在使用它來設置'n',而不是真的有任何不同(除了你不再使用_same_變量)'y = 7; x = y ++':在這種情況下,最終值是'x == 7,y == 8'。 – paxdiablo 2011-05-27 05:26:48

+0

好的..誰在關注這個?編譯器??? – 2011-05-27 05:29:41

2

n=n++;

評估順序是從左到右。 每次迭代後n被賦值爲0,因爲n++在增量前計算爲n

所以這就是你得到的輸出。

你應該寫n = n+1以獲得所需的輸出..

P.S:在阿里納斯n = n++調用未定義行爲的C和C++。 ;-)

5

那是因爲您使用的是post-increment(n ++)而不是pre-increment(++ n)。這條線會做你期待什麼:

n = (++n); 

PS:是的,這些鏈接解釋爲C/C++,但行爲是在幾乎所有的編程語言相同。

編輯:感謝Prasoon Saurav和paxdiablo,今天我學到了一些新東西。鏈接的網站可能是錯誤的C和C++,但他們仍然解釋在Java中發生了什麼。

+0

錯!在C和C++中,對於'n = n ++'和'n = ++ n'的行爲是未定義的,對於'n = ++ n' – 2011-05-27 05:22:55

+0

增量的行爲可能是相同的(我認爲這就是你所得到的),但請記住_expression本身_是C或C++中的禁止 - 兩個修改之間沒有順序點,所以結果是未定義的。 – paxdiablo 2011-05-27 05:23:53

0

n ++表示「返回當前值,然後遞增」。所以你正在做的是返回0,遞增到1,然後將以前的值(0)分配回n。

最終結果 - n保留0。