int main()
{
int i = 8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++ , -i--); // 输出结果怎么不是
// i=9
// i=8
// i=8
//i=8
// i= -8
// i = -9
return 0;
}
这应该和参数的栈顺序有关吧
++和--运算的执行从最后一个开始执行
首先我这边环境的输出是
8
8
7
8
-7
-8
按照++和--的执行顺序,从最后一个开始,-i--就是-8,然后i变为7
然后-i++就是-7,因为++是后置的,然后i再变为8,以此类推。
最终输出时,把那些-8,-7等数字,从前往后再输出,就是你看到的结果了。
函数的参数存储在栈内,一般的C调用顺序(应该也不能说一般吧),把参数从后往前放入栈中,因此从后往前计算++或--。
补充,printf在库的定义,参数的压栈顺序是cdecl
因此从后向前
看汇编,你就明白为什么。
#include <stdio.h>
int main()
{
00401060 push ebp
00401061 mov ebp,esp
00401063 sub esp,54h
00401066 push ebx
00401067 push esi
00401068 push edi
int i = 8;
00401069 mov dword ptr [i],8
printf("%d\n%d\n%d\n%d\n%d\n%d\n", ++i, --i, i++, i--, -i++, -i--);
00401070 mov eax,dword ptr [i]
00401073 neg eax
00401075 mov dword ptr [ebp-48h],eax
00401078 mov ecx,dword ptr [i]
0040107B neg ecx
0040107D mov dword ptr [ebp-4Ch],ecx
00401080 mov edx,dword ptr [i]
00401083 mov dword ptr [ebp-50h],edx
00401086 mov eax,dword ptr [i]
00401089 mov dword ptr [ebp-54h],eax
0040108C mov ecx,dword ptr [i]
0040108F sub ecx,1
00401092 mov dword ptr [i],ecx
00401095 mov edx,dword ptr [i]
00401098 add edx,1
0040109B mov dword ptr [i],edx
0040109E mov eax,dword ptr [ebp-48h]
004010A1 push eax
004010A2 mov ecx,dword ptr [ebp-4Ch]
004010A5 push ecx
004010A6 mov edx,dword ptr [ebp-50h]
004010A9 push edx
004010AA mov eax,dword ptr [ebp-54h]
004010AD push eax
004010AE mov ecx,dword ptr [i]
004010B1 push ecx
004010B2 mov edx,dword ptr [i]
004010B5 push edx
004010B6 push offset string "%d\n%d\n%d\n%d\n%d\n%d\n" (0403100h)
004010BB call printf (04010F0h)
004010C0 add esp,1Ch
004010C3 mov eax,dword ptr [i]
004010C6 add eax,1
004010C9 mov dword ptr [i],eax
004010CC mov ecx,dword ptr [i]
004010CF sub ecx,1
004010D2 mov dword ptr [i],ecx
004010D5 mov edx,dword ptr [i]
004010D8 add edx,1
004010DB mov dword ptr [i],edx
004010DE mov eax,dword ptr [i]
004010E1 sub eax,1
004010E4 mov dword ptr [i],eax
return 0;
004010E7 xor eax,eax
}
004010E9 pop edi
004010EA pop esi
004010EB pop ebx
004010EC mov esp,ebp
004010EE pop ebp
004010EF ret