1. 程式人生 > >關於C語言中a=a++與a=++a的研究

關於C語言中a=a++與a=++a的研究

今天逛論壇,發現有朋友對a++與++a的結果有爭議,由於自己也不清楚,就決定反彙編一下,看看是什麼原因,過程如下:

問題:
int a=3;
a=a++;
輸出結果a=3
圖片

研究過程:
自己寫了下原始碼:

QQ截圖20130513155642.jpg

反彙編(為了能看明白,我加了些註釋,並劃分了五個區域):
QQ截圖20130513155617.jpg

從第二個區域可以看出,其實a已經從3變為了4,只不過,還沒有使用,就已經被原來的值覆蓋了

INC     DWORD PTR [EAX]                 ;變數a = a + 1
MOV     DWORD PTR [EBP-4], EDX          ;將EDX的值(EDX=3)放入變數a的地址

那麼到底是為什麼,我決定做一下實驗,首先想到了會不會是a=a++;與a=++a;不同導致的。
為了對照一下"a=a++" 與 "a=++a"區別在哪裡,我重新修改了一下程式碼:

QQ截圖20130513161344.jpg

可以看出程式碼【3】與這一段的區別:
b=a++;的執行如下:
1.取出a的值,放在一個臨時變數裡(int temp = a;)
2.a自增(a = a + 1;)
3.將臨時變數的值,傳給b(b = temp;)

而b=++a;的執行如下:
1.a自增(a = a + 1;)
2.將a的值,傳給b(b = a;)

那麼,對照以上兩點,再來看a = a++,由於是後置的自增,應該參照第一個方式:
猜測:
1.取出a的值,放入臨時變數(temp = a;)
2.a自增(a = a + 1;)
3.將臨時變數的值,傳給a(a = temp;)

實際(程式碼段【2】,就不貼了)

猜測 == 事實
研究結束。