rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" target="_blank" rel="external nofollow" >
前幾天,中午去吃飯的時候,“指導”問了一個C++的問題:
- int i = 0;
- i = i ++;
- printf("%d/n", i);
輸出是0還是1呢?
當時想了一下覺得應該是0,我的了解是“++”的優先級高于指派,i = i ++;i的值0先被讀出到寄存器(如R中),然後對i進行自加操作(此時i為1),最後對用寄存器R對i指派,自加的結果被最後指派的結果覆寫,是以結果應該為0。
回到宿舍,用VC++6.0小試一下,出乎意料,輸出居然是“1”!進入彙編調試看一下彙編代碼(如圖-1所示),“++”操作竟在指派之後進行。
圖-1
後來,又在DevC++5上實驗得到的結果是“0”!!,檢視彙編代碼(如圖-2所示),跟我剛開始的想法一緻的。
圖-2
DevC++屬于GCC家族的,本以為在g++(4.1.2版本)裡結果應該也是“0”,結果又一次出乎意料,g++輸出是“1”!!!看了一下g++的編譯結果(如圖-3所示)。
圖-3
按照一個師兄的說法,C++标準裡是說,後置“++”操作是在整條語句執行完之後才自加的。
那DevC++的編譯結果該怎麼了解,後面嘗試了一下:
- int i = 0;
- i = 2 + i++;
- printf("%d/n", i); // DevC++5、VC++6.0和g++輸出都是3
上述代碼的DevC++5的編譯結果如圖-4所示,看來DevC++5隻是在“i = i++;”的情況下,自加在指派之前完成。
圖-4
最後,在java裡,用sun公司提供的JDK1.6.0_06對上述兩段代碼進行了測試結果分别是0和2。應該是按運算符優先級,先自加,再指派的。