首页 > 代码库 > 关于++n和n++的打印输出问题
关于++n和n++的打印输出问题
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中第二行的输出结果了吧
关于++n和n++的打印输出问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。