C語言中自增運算符的解析

關於C語言中a++, ++a這種自增運算的討論其實很無聊,但是有時候爲了應付面試,還不得不細細探討一下。

環境:Win7,VS2010


例題:

寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值(3分)

int a = 4;
(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);

問:a = ?


答:C錯誤,左側不是一個有效變量,不能賦值,可改爲(++a) += a;

改後答案依次爲9,10,10,11


分析:

A選項 a += (a++);

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
00F7136E  mov   dword ptr [a],4  
          a += (a++);
00F71375  mov   eax,dword ptr [a]  //把a的值存到eax,此時eax=4
00F71378  add   eax,dword ptr [a]  //eax的值加a,此時eax=8
00F7137B  mov   dword ptr [a],eax  //把eax存到a中,即a=8,由此可以看出,a+=(a++)首先執行的是a = a+a;
00F7137E  mov   ecx,dword ptr [a]  //把a存到ecx
00F71381  add   ecx,1  //ecx+1,此時ecx=9;
00F71384  mov   dword ptr [a],ecx  //ecx存回a,即a=9
return 0;
00F71387  xor   eax,eax  
}


B選項 a += (++a) ;

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
0129136E  mov  dword ptr [a],4  
          a += (++a);
01291375  mov  eax,dword ptr [a]  
01291378  add  eax,1  //先加1,此時eax=5
0129137B  mov  dword ptr [a],eax   //eax存回a,此時a=5
0129137E  mov  ecx,dword ptr [a]  
01291381  add  ecx,dword ptr [a]  //ecx=ecx+ecx,此時ecx=10
01291384  mov  dword ptr [a],ecx //此時a=10
          return 0;
01291387  xor  eax,eax  
}


C選項:(a++) += a;

編譯出錯:error C2106: '+=' : left operand must be l-value。(a++)是一個表達式,不能賦值。


D選項: (++a) += (a++);

int _tmain(int argc, _TCHAR* argv[])
{
          int a = 4;
0129136E  mov  dword ptr [a],4  
          (++a) += (a++);
00D81375  mov  eax,dword ptr [a]  
00D81378  add  eax,1  
00D8137B  mov  dword ptr [a],eax  //完成++a,此時a=5;
00D8137E  mov  ecx,dword ptr [a]  
00D81381  add  ecx,dword ptr [a]  //完成a=a+a;此時a=10;
00D81384  mov  dword ptr [a],ecx  
00D81387  mov  edx,dword ptr [a]  
00D8138A  add  edx,1  
00D8138D  mov  dword ptr [a],edx  //完成a++;此時a=11
return 0;
01291387  xor  eax,eax  
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章