關於C語言中a=a++與a=++a的研究
阿新 • • 發佈:2019-02-18
今天逛論壇,發現有朋友對a++與++a的結果有爭議,由於自己也不清楚,就決定反彙編一下,看看是什麼原因,過程如下:
問題:
int a=3;
a=a++;
輸出結果a=3
研究過程:
自己寫了下原始碼:
反彙編(為了能看明白,我加了些註釋,並劃分了五個區域):
那麼到底是為什麼,我決定做一下實驗,首先想到了會不會是a=a++;與a=++a;不同導致的。
為了對照一下"a=a++" 與 "a=++a"區別在哪裡,我重新修改了一下程式碼:
可以看出程式碼【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】,就不貼了)
猜測 == 事實
研究結束。
問題:
int a=3;
a=a++;
輸出結果a=3
研究過程:
自己寫了下原始碼:
反彙編(為了能看明白,我加了些註釋,並劃分了五個區域):
從第二個區域可以看出,其實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"區別在哪裡,我重新修改了一下程式碼:
可以看出程式碼【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】,就不貼了)
猜測 == 事實
研究結束。