2012-05-08 335 views
1

這段代碼的輸出是:後增量運算

c: 1 , id: 0

我想知道爲什麼輸出不是:

c: 0 , id: 1

class A { 
    private static long c; 
    private final long id = c++; 
    public A() { 
     print("c: " + c + " , id: " + id); 
    } 
} 
+0

'C++'會增加'C'(後遞增),既然你說遞增後,'id'將得到遞增之前'c'的值。 – birryree

回答

4

因爲像c++的表達操作是這樣的:

  • 評估c;記住這一點(例如tmp = c;)
  • 增量c
  • 的表達式的結果是該原始值(tmp

因此,在這種情況下,與c = 0開始,所以id變爲0 .. 。但c在該過程中遞增,因此c在評估表達式後爲1。

有關更多詳細信息,請參閱Java語言規範的section 15.14.2。摘錄:

在運行時,如果操作數表達式的計算突然完成,那麼後綴遞增表達突然完成出於同樣的原因,並沒有增量發生。否則,將值1添加到變量的值中,並將總和存回變量。在添加之前,對值1和變量的值執行二進制數字提升(第5.6.2節)。如果有必要,總和會通過縮小的原始轉換(§5.1.3)和/或經過裝箱轉換(§5.1.7)縮小到存儲前的變量類型。後綴增量表達式的值是存儲新值之前的變量值。

1

id = c++分配值爲cid,然後它增加c。這就好像你做了以下事情:

c = 0; 
id = c; // assigns zero 
c = c + 1; 

嘗試id = ++c改爲。

1

因爲你使用C++。

C++意味着你首先將變量保存到你的id然後增加++。

如果你使用++ c,你會先遞增然後保存到id。

但它會返回c:1 id:1,因爲C++意味着c = c + 1!

如果你說:ID = C + 1,你會得到C:0和ID:1