1、问题的引出
#include "stdafx.h" #include <iostream> using namespace std; int main() { int n=10; //printf("%d%d%d%d%d",n,n++,n,++n,++n); cout<<n<<" "<<n++<<" "<<n++<<endl; cout<<n<<" "<<n++<<" "<<n++<<" "<<++n<<" "<<++n<<endl; system("pause"); return 0; }
第一行输出比较好理解,需要注意的问题是输出的压栈顺序是自右向左(与函数的参数压栈顺序相同)。那第二行输出呢?
2、看一个例子
printf("%d%d%d%d%d",n,n++,n,++n,++n);
的汇编代码及注释如下
//++n; 00094A45 mov eax,dword ptr [n] 00094A48 add eax,1 00094A4B mov dword ptr [n],eax //++n; 00094A4E mov ecx,dword ptr [n] 00094A51 add ecx,1 00094A54 mov dword ptr [n],ecx //n++ //n存储到 [ebp-0D0h] 此时n=3; ---可见n++保存n值后,再进行+1操作 00094A57 mov edx,dword ptr [n] 00094A5A mov dword ptr [ebp-0D0h],edx 00094A60 mov eax,dword ptr [n] 00094A63 add eax,1 00094A66 mov dword ptr [n],eax //把当前的堆栈指针放到esi中暂存 00094A69 mov esi,esp //n=4入栈 00094A6B mov ecx,dword ptr [n] 00094A6E push ecx //n=4入栈 00094A6F mov edx,dword ptr [n] 00094A72 push edx //n=4入栈 00094A73 mov eax,dword ptr [n] 00094A76 push eax //n=3入栈 00094A77 mov ecx,dword ptr [ebp-0D0h] 00094A7D push ecx //n=4入栈 00094A7E mov edx,dword ptr [n] 00094A81 push edx //字符串指针入栈 00094A82 push offset string "%d%d%d%d%d" (978A0h) //调用printf函数 00094A87 call dword ptr [__imp__printf (9A3D0h)] //清栈 5个int + 1个指针 = 24字节 = 18h 00094A8D add esp,18h //比较堆栈指针和函数调用前是否平衡 00094A90 cmp esi,esp //debug函数,检查堆栈平衡 00094A92 call @ILT+400(__RTC_CheckEsp) (91195h)
想必大家已经知道为什么有1中第二行的输出结果了吧
时间: 2024-11-10 00:50:00