天天看點

i = i++ 的困惑

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" target="_blank" rel="external nofollow" >

前幾天,中午去吃飯的時候,“指導”問了一個C++的問題:

  1. int i = 0;
  2. i = i ++;
  3. printf("%d/n", i);

輸出是0還是1呢?

當時想了一下覺得應該是0,我的了解是“++”的優先級高于指派,i = i ++;i的值0先被讀出到寄存器(如R中),然後對i進行自加操作(此時i為1),最後對用寄存器R對i指派,自加的結果被最後指派的結果覆寫,是以結果應該為0。

回到宿舍,用VC++6.0小試一下,出乎意料,輸出居然是“1”!進入彙編調試看一下彙編代碼(如圖-1所示),“++”操作竟在指派之後進行。

i = i++ 的困惑

                            圖-1

後來,又在DevC++5上實驗得到的結果是“0”!!,檢視彙編代碼(如圖-2所示),跟我剛開始的想法一緻的。

i = i++ 的困惑

                                                圖-2

DevC++屬于GCC家族的,本以為在g++(4.1.2版本)裡結果應該也是“0”,結果又一次出乎意料,g++輸出是“1”!!!看了一下g++的編譯結果(如圖-3所示)。

i = i++ 的困惑

                                                圖-3

按照一個師兄的說法,C++标準裡是說,後置“++”操作是在整條語句執行完之後才自加的。

那DevC++的編譯結果該怎麼了解,後面嘗試了一下:

  1. int i = 0;
  2. i = 2 + i++;
  3. printf("%d/n", i); // DevC++5、VC++6.0和g++輸出都是3

上述代碼的DevC++5的編譯結果如圖-4所示,看來DevC++5隻是在“i = i++;”的情況下,自加在指派之前完成。

i = i++ 的困惑

                           圖-4

最後,在java裡,用sun公司提供的JDK1.6.0_06對上述兩段代碼進行了測試結果分别是0和2。應該是按運算符優先級,先自加,再指派的。