关于++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中第二行的输出结果了吧

时间: 2024-11-10 00:50:00

关于++n和n++的打印输出问题的相关文章

用指针引用数组元素并打印输出

<span style="font-size:18px;">#include<stdio.h> void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//数组指针变量声明 int row,col; p=a;//指针p指向数组元素为4的数组 //打印输出数组指针p指向的数组的值 for(row=0;row<3;row++) { for(col=0;col<4;

“ArcGIS数据应用和地图打印输出

中国科学院计算技术研究所教育中心 关于开展“ArcGIS数据应用和地图打印输出” 培训班的通知 各相关单位: 随着信息化.网络化.数字化向纵深发展,互联网与空间地理信息系统相互交织,数字地球.“智慧地球”逐步从理念转为应用.新的形势下,地理信息成为国家创新体系和信息化建设的重要组成部分,要突出加强基础地理信息系统建设,加快形成数字中国地理空间框架,加快信息化体系建设,切实提高地理信息系统对现代化建设的服务能力.为此,中国科学院计算技术研究所教育中心(http://ec.ict.ac.cn)特举办

本程序找出字符串数组 String[] arr = {“welcome”, “china”, “hi”, “congratulation”, “great”} 中的长度最大的元素,并打印输出。

/** * Homework14 * * @Description:本程序找出字符串数组 String[] arr = {"welcome", "china", "hi", * "congratulation", "great"} 中的长度最大的元素,并打印输出. * StringDemo01 * * @author  * * email: [email protected] 2017年4月18日下午6:3

Json转string对象 打印输出; String 转json数组

后台json转成string对象的形式打印输出 success:function(json){     JSON.stringify(json) } 打印形式 [{"id":"3","text":"主页","FUN_ID":"3","FUN_CD":"5","pid":"","FUN_NM"

console.debug()浏览器控制台打印输出 仅仅在支持console的浏览器下打印

console.debug()浏览器控制台打印输出 仅仅在支持console的浏览器下打印 var util = {}; /** * 工具类 */ util = new function() { /** * 控制台打印输出 仅仅在支持console的浏览器下打印 * @param info 信息打印 */ this.debug = function(info){ try{ if(console != undefined && console != null && conso

链表(创建,插入,删除和打印输出(转载)

链表(创建,插入,删除和打印输出 /*----------------------------------------------------------------------------- 文件功能:实现了动态建立一个学生信息的链表包括链表的创建.插入.删除.和打印输出学生信息包括姓名和分数本链表是带有头结点的,头结点的内容为空内容-----------------------------------------------------------------------------*//*

IAR使用printf()函数 打印输出

IAR使用printf()函数 打印输出 1.需要包含头文件:#include <stdio.h> 2.进入仿真调试界面 图(一) 3.调出虚拟终端 图(二) 3.打印输出printf内容 图(三)

如何屏蔽LOGD\LOGI等打印输出

今天被打印信息的去除困扰了,想了想,如果靠一个一个的改动未免太繁琐.因此就仔细的看了下这部分的打印原理.当然下面只是简单的进行了知识罗列不过有需要的朋友可以随便看看.说不准会有些收获呢. Include/linux/printk.h中有如下定义: #defineKERN_EMERG "<0>" /* system is unusable */ #defineKERN_ALERT "<1>" /* action must be taken im

iOS调试技巧之打印输出 -----A: (NSString *)description B:自定义LOG C:使用第三方插件快速打印

A:重写- (NSString *)description函数 如果有一个Product 产品对象  Product.h中 1 #import <Foundation/Foundation.h> 2 3 typedef enum : NSUInteger { 4 RED = 1, 5 GREEN, 6 } ProductColor; 7 8 @interface Product : NSObject 9 10 @property (nonatomic, assign) ProductColor

C++ 打印输出指针

大家想必在很多场景下需要打印输出指针地址.看一下下面的输出:       CObject* pObject = new CObject;     std::cout << pObject << std ::endl;   这样直接打印出指针的pObjedct地址.但是下面的输出 char* ptr = "abc";    std::cout << ptr << std ::endl; 直接输出字符串:"abc",这是为