VC++6.0 之 bug
#include "stdio.h"main()
{
int i=1;
printf("%d,%d,%d\n",i,++i,i++);
printf("%d",i);
}
输出结果为:
2,2,1
3
可以看出该编译系统在预算pintf()函数里面的变量
按照从右往左计算
按思维分析
可知这样的结果应为:
3,3,1
3
若使用win-tc
结果却和分析形同
即:
3,3,1
3
4: int i=1; 00401028 mov dword ptr [ebp-4],1///////////////////i值存在ptr [ebp-4] 其值为1 5: printf("%d,%d,%d\n",i,++i,i++); 0040102F mov eax,dword ptr [ebp-4] 00401032 mov dword ptr [ebp-8],eax 00401035 mov ecx,dword ptr [ebp-8] 00401038 push ecx //////////////////////////////////i++最先入栈 存在ptr [ebp-8] 其值为1; i值仍然存在ptr [ebp-4] 其值为1 00401039 mov edx,dword ptr [ebp-4] 0040103C add edx,1 0040103F mov dword ptr [ebp-4],edx 00401042 mov eax,dword ptr [ebp-4] 00401045 push eax//////////////////////////////////然后++i入栈 自加后 存在ptr [ebp-4] 值为2; 00401046 mov ecx,dword ptr [ebp-4] 00401049 push ecx///////////////////////////////////最后i入栈 值为ptr [ebp-4] 的2 0040104A push offset string "%d,%d,%d\n" (00422020)//i最后入栈最先被压入第一个%d 接着是++i 和 i++ 0040104F mov edx,dword ptr [ebp-4] 00401052 add edx,1 ////////////////////压入字符串后的最后之最后 i++露出自加本性 i=2+1 00401055 mov dword ptr [ebp-4],edx 00401058 call printf (004010a0) 0040105D add esp,10h 6: printf("%d",i); 00401060 mov eax,dword ptr [ebp-4] 00401063 push eax 00401064 push offset string "%d" (0042201c) 00401069 call printf (004010a0) 0040106E add esp,8