关于++n和n++的打印输出问题
2014-08-31 10:38
281 查看
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 00094A48 add eax,1 00094A4B mov dword ptr ,eax //++n; 00094A4E mov ecx,dword ptr 00094A51 add ecx,1 00094A54 mov dword ptr ,ecx //n++ //n存储到 [ebp-0D0h] 此时n=3; ---可见n++保存n值后,再进行+1操作 00094A57 mov edx,dword ptr 00094A5A mov dword ptr [ebp-0D0h],edx 00094A60 mov eax,dword ptr 00094A63 add eax,1 00094A66 mov dword ptr ,eax //把当前的堆栈指针放到esi中暂存 00094A69 mov esi,esp //n=4入栈 00094A6B mov ecx,dword ptr 00094A6E push ecx //n=4入栈 00094A6F mov edx,dword ptr 00094A72 push edx //n=4入栈 00094A73 mov eax,dword ptr 00094A76 push eax //n=3入栈 00094A77 mov ecx,dword ptr [ebp-0D0h] 00094A7D push ecx //n=4入栈 00094A7E mov edx,dword ptr 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中第二行的输出结果了吧
相关文章推荐
- 关于富客户断的打印输出问题
- 关于Android Logcat打印输出中文乱码问题的解决方法
- [009]C---关于输出文本的打印问题
- 关于断点调试输出信息出不来,用po打印变量也没有值的问题
- 关于open()返回值及打印输出的问题
- 关于Android LogCat不打印日志输出的问题
- 关于VFP报表输出时是否有打印设置问题的解决
- 关于输出 YYYY/MM/DD 的问题(ZT)
- java 中关于 Exception 的几种打印输出 和 StringTokenizer 的用法
- 关于JSP中字符串输出问题
- 关于asp.net中输出Javascript一些问题
- 关于websphere v6的采用log4j输出日志信息的问题
- 关于websphere v6的采用log4j输出日志信息的问题
- 关于ActiveReport使用ActivexViewer输出时,客户端不会提示下载控件的问题.
- 关于websphere v6的采用log4j输出日志信息的问题
- 关于使用System.out.println()向控制台输出数据和使用out.println()向页面输出数据效率的问题
- window.print 关于web打印问题
- 关于MO打印时不能正确打印用DC自己画出来的图片的问题的解决方案
- [导入]关于用xslt输出xml的问题
- 关于java运行命令行程序输出的问题