首页 > 代码库 > 关于++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++的打印输出问题