關於C語言中a++, ++a這種自增運算的討論其實很無聊,但是有時候爲了應付面試,還不得不細細探討一下。
環境:Win7,VS2010
例題:
寫出判斷ABCD四個表達式的是否正確, 若正確, 寫出經過表達式中 a的值(3分)
int a = 4;(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (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
}