故事背景,一個正在c語言的家伙,問我++i 和 i++的問題,我當時因為要去上課沒給他說,正好今晚有空就測試了一下如下代碼:
編譯環境:VS2010 語言:C++
1 #include2 using namespace std; 3 4 int main(void) 5 { 6 int a = 1; 7 int b = 1; 8 int c; 9 10 c = a++; 11 c = ++b; 12 13 return 0; 14 }
我們站在匯編的角度來說明一下問題:
可能你沒學過匯編,不過沒關系,我們先來科普一下匯編基本知識。(我自己也不會匯編,只是能看懂一些簡單匯編代碼)
-----------------------------------------------------------------
1)dword ptr : dword -> double word 雙字節 ptr -> pointer 指針 2)mov a b : 表示將b的值賦值給a 3)add x y : 表示取x的值和y的值相加,結果再放入x中 4)另外就是cpu的8個通用寄存器 :eax, ebx, ecx, edx, esi, edi, ebp, esp eax :是"累加器", 它是很多加法乘法指令的缺省寄存器 ecx :是"計數器", 是重復(REP)前綴指令和LOOP指令的內定計數器
-----------------------------------------------------------------
好了,下面的匯編代碼我再簡單解釋一下,就基本差不多了。
說明:以下匯編代碼解釋過程中,比如:eax=1,是表示目前eax中的值為1.
1 int a = 1; 2 00EC136E mov dword ptr [a],1 //給a賦值1 3 int b = 1; 4 00EC1375 mov dword ptr [b],1 //給b賦值1 5 int c; 6 7 c = a++; 8 00EC137C mov eax,dword ptr [a] //將a=1放入eax=1寄存器中 9 00EC137F mov dword ptr [c],eax //將eax=1放入c=1的地址中 10 00EC1382 mov ecx,dword ptr [a] //將a=1放入ecx=1寄存器中 11 00EC1385 add ecx,1 //將ecx=1和1相加,並放入ecx=2寄存器中 12 00EC1388 mov dword ptr [a],ecx //將ecx=2寄存器裡的值放入a=2中 13 c = ++b; 14 00EC138B mov eax,dword ptr [b] //將b=1放入eax=1寄存器中 15 00EC138E add eax,1 //將eax=1與1相加,並放入eax=2寄存器中 16 00EC1391 mov dword ptr [b],eax //將eax=2寄存器裡的值放入b=2中 17 00EC1394 mov ecx,dword ptr [b] //將b=2放入ecx=2寄存器中 18 00EC1397 mov dword ptr [c],ecx //將ecx=2寄存器裡的值放入c=2中 19 20 return 0; 21 00EC139A xor eax,eax 22 }
從上面的一段匯編代碼中我們可以很清晰的看到,匯編後:
1)c = a++; 其中c的值是1,但是a中的值卻已經變化為2了。
2)c = ++b; 其中c的值是2,b的值也是2。
--------------------------------------------------------------
原文地址:http://www.cnblogs.com/nchar/p/3913724.html