int main()
{
int i = 1;
printf("%d/n%d/n%d/n", i, i++, ++i);
return 0;
}
在vs2008下输出3 2 3。
部分汇编代码如下:
int i = 1;
00418AAE mov dword ptr [i],1 //i=1
printf("%d/n%d/n%d/n", i, i++, ++i);
00418AB5 mov eax,dword ptr [i]
00418AB8 add eax,1
00418ABB mov dword ptr [i],eax //i = i+1=2
00418ABE mov ecx,dword ptr [i]
00418AC1 mov dword ptr [ebp-0D0h],ecx //临时变量等于2
00418AC7 mov edx,dword ptr [i]
00418ACA add edx,1
00418ACD mov dword ptr [i],edx //i = i+1=3
00418AD0 mov esi,esp
00418AD2 mov eax,dword ptr [i]
00418AD5 push eax //i入栈,第三个参数不是++i么,为什么?
00418AD6 mov ecx,dword ptr [ebp-0D0h]
00418ADC push ecx //临时变量入栈
00418ADD mov edx,dword ptr [i]
00418AE0 push edx //i入栈
00418AE1 push offset string "%d/n%d/n%d/n" (41BA24h)
00418AE6 call dword ptr [__imp__printf (4204C4h)]
00418AEC add esp,10h
00418AEF cmp esi,esp
00418AF1 call @ILT+885(__RTC_CheckEsp) (41137Ah)
先从右往左求值,后又从右往左参数入栈。
再如:
int main()
{
int i = 1;
printf("%d/n%d/n%d/n", i, (++i)+(++i)+(i++), ++i);
return 0;
}
在vs2008下输出5 12 5。
部分汇编代码如下:
00418AAE mov dword ptr [i],1
printf("%d/n%d/n%d/n", i, (++i)+(++i)+(i++), ++i);
00418AB5 mov eax,dword ptr [i]
00418AB8 add eax,1
00418ABB mov dword ptr [i],eax
00418ABE mov ecx,dword ptr [i]
00418AC1 add ecx,1
00418AC4 mov dword ptr [i],ecx
00418AC7 mov edx,dword ptr [i]
00418ACA add edx,1
00418ACD mov dword ptr [i],edx
00418AD0 mov eax,dword ptr [i]
00418AD3 add eax,dword ptr [i]
00418AD6 add eax,dword ptr [i] //为什么呢?
00418AD9 mov dword ptr [ebp-0D0h],eax
00418ADF mov ecx,dword ptr [i]
00418AE2 add ecx,1
00418AE5 mov dword ptr [i],ecx
00418AE8 mov esi,esp
00418AEA mov edx,dword ptr [i]
00418AED push edx
00418AEE mov eax,dword ptr [ebp-0D0h]
00418AF4 push eax
00418AF5 mov ecx,dword ptr [i]
00418AF8 push ecx
00418AF9 push offset string "%d/n%d/n%d/n" (41BA24h)
00418AFE call dword ptr [__imp__printf (4204C4h)]
00418B04 add esp,10h
00418B07 cmp esi,esp
00418B09 call @ILT+885(__RTC_CheckEsp) (41137Ah)