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
