再解析i++与++i的区别前我们先看两道题:
#define SQUARE(a)((a)*(a))
int a=5;
int b=SQUARE(a++);
int c=5;
int d=SQUARE(++c);
答案是a=7,b=25,c=7,d=49,
其实从这个答案上我们就可以看出些眉目了,当a++作为参数的时候,其实先以a的原值(未加1之前的值)作为操作数进行运算,运算结束后再执行a的自加操作,当c++作为参数的时候,其实先执行c的自加操作,运算结束后再以c改变后的值(加1之后的值)作为操作数进行运算
在vc中看汇编代码就可以证实这一点
259: int a=5;
00401F9D mov dword ptr [ebp-8],5
260:
261: int b=SQUARE(a++);
00401FA4 mov eax,dword ptr [ebp-8]
00401FA7 imul eax,dword ptr [ebp-8] //先执行imul
00401FAB mov dword ptr [ebp-0Ch],eax
00401FAE mov ecx,dword ptr [ebp-8]
00401FB1 add ecx,1 //自加
00401FB4 mov dword ptr [ebp-8],ecx
00401FB7 mov edx,dword ptr [ebp-8]
00401FBA add edx,1//自加
00401FBD mov dword ptr [ebp-8],edx
262:
263: int c=5;
00401FC0 mov dword ptr [ebp-10h],5
264: int d=SQUARE(++c);
00401FC7 mov eax,dword ptr [ebp-10h]
00401FCA add eax,1//自加
00401FCD mov dword ptr [ebp-10h],eax
00401FD0 mov ecx,dword ptr [ebp-10h]
00401FD3 add ecx,1//自加
00401FD6 mov dword ptr [ebp-10h],ecx
00401FD9 mov edx,dword ptr [ebp-10h]
00401FDC imul edx,dword ptr [ebp-10h]/再执行imul
00401FE0 mov dword ptr [ebp-14h],edx