关于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
}