故事背景,一个正在c语言的家伙,问我++i 和 i++的问题,我当时因为要去上课没给他说,正好今晚有空就测试了一下如下代码:

编译环境:VS2010  语言:C++

 #include <iostream>
using namespace std; int main(void)
{
int a = ;
int b = ;
int c; c = a++;
c = ++b; return ;
}

一、我们站在汇编的角度来说明一下问题:

可能你没学过汇编,不过没关系,我们先来科普一下汇编基本知识。(我自己也不会汇编,只是能看懂一些简单汇编代码)

-----------------------------------------------------------------

1)dword ptr  : dword -> double word 双字节   ptr ->  pointer 指针
2)mov a b : 表示将b的值赋值给a
3)add x y : 表示取x的值和y的值相加,结果再放入x中
4)另外就是cpu的8个通用寄存器 :eax, ebx, ecx, edx, esi, edi, ebp, esp
eax :是"累加器", 它是很多加法乘法指令的缺省寄存器
ecx :是"计数器", 是重复(REP)前缀指令和LOOP指令的内定计数器

-----------------------------------------------------------------

好了,下面的汇编代码我再简单解释一下,就基本差不多了。

说明:以下汇编代码解释过程中,比如:eax=1,是表示目前eax中的值为1.

 int a = ;
00EC136E mov dword ptr [a], //给a赋值1
int b = ;
00EC1375 mov dword ptr [b], //给b赋值1
int c; c = a++;
00EC137C mov eax,dword ptr [a] //将a=1放入eax=1寄存器中
00EC137F mov dword ptr [c],eax //将eax=1放入c=1的地址中
00EC1382 mov ecx,dword ptr [a] //将a=1放入ecx=1寄存器中
00EC1385 add ecx, //将ecx=1和1相加,并放入ecx=2寄存器中
00EC1388 mov dword ptr [a],ecx //将ecx=2寄存器里的值放入a=2中
c = ++b;
00EC138B mov eax,dword ptr [b] //将b=1放入eax=1寄存器中
00EC138E add eax, //将eax=1与1相加,并放入eax=2寄存器中
00EC1391 mov dword ptr [b],eax //将eax=2寄存器里的值放入b=2中
00EC1394 mov ecx,dword ptr [b] //将b=2放入ecx=2寄存器中
00EC1397 mov dword ptr [c],ecx //将ecx=2寄存器里的值放入c=2中 return ;
00EC139A xor eax,eax
}

从上面的一段汇编代码中我们可以很清晰的看到,汇编后:

1)c = a++;   其中c的值是1,但是a中的值却已经变化为2了。

2)c = ++b;   其中c的值是2,b的值也是2。

二、下面用C++中的 ++i 与 i++ 的重载示例来说明一下问题:

 /*win7_32bit,VS2010,2014年8月19日08:16:11*/
#include <iostream>
using namespace std; class Test
{
public:
Test(int var) : m_var(var)
{}
//重载i++
const Test operator++(int)//返回const的目的在于,使"i++ = 12"这种写法非法(注意,这里不能返回栈上的引用)
{
Test t = *this; //保存原来的数据
++m_var;
return t; //返回原来的数据
}
//重载++i
Test& operator++() //为了支持"++i = 10"这种写法,我们返回一个对象的引用
{
++m_var;
return *this;
}
//重载输出流
friend ostream& operator<<(ostream& os, const Test& t);
private:
int m_var;
};
ostream& operator<<(ostream& os,const Test& t)
{
os<<t.m_var;
return os;
} int main(void)
{
Test a();
Test b();
cout<<a++<<endl;//result:2
cout<<++b<<endl;//result:4
++a = ; //ok
cout<<a<<endl; //result:10
//b++ = 12; const 不能赋值,error return ;
}

--------------------------------------------------------------

原文地址:http://www.cnblogs.com/nchar/p/3913724.html

汇编下的i++与++i的更多相关文章

  1. windows下实现微秒级的延时

    windowsintegeriostream汇编嵌入式任务 最近正在做一个嵌入式系统,是基于windows ce的,外接硬件的时序要微秒级的延时.1.微秒级的延时肯定不能基于消息(SetTimer函数 ...

  2. 伟福与Keil的比较--51汇编提高篇

    [写在前面] 本文适合有一定汇编水平的人(了解大半的汇编语句,能区分全角与半角符号,能够独立编写流水灯.数码管等程序),传授51单片机的汇编语言经验.如果您发现不少指令不知道意思,请从网上搜索入门教程 ...

  3. PC逆向之代码还原技术,第五讲汇编中乘法的代码还原

    目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...

  4. [C/C++]linux下c-c++语法知识点归纳和总结

    1.c/c++申请动态内存 在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数. 而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函 ...

  5. Java并发基础总结

    并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可 交互性将大大改善.现代的PC都有多个CPU或一个CPU中有多 ...

  6. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

  7. C/C++ 笔试、面试题目大汇总

    1.求下面函数的返回值( 微软) int func(x) { int countx =0; while(x) { countx ++; x = x&(x-1); } return countx ...

  8. C/C++笔试题(很多)

    微软亚洲技术中心的面试题!!! .进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2 ...

  9. (C++) 基本面试题(整理)

    1.new.delete.malloc.free关系 new/delete是C++的运算符.new 调用构造函数用于动态申请内存,delete调用对象的析构函数,用于释放内存. malloc与free ...

随机推荐

  1. Java---多线程之死锁

    ★ 死锁的两种情况: 简单的说下单块cpu运行多线程的情况: 大家可能平时玩电脑,可以同时挂QQ啊,玩游戏啊,打开文本啊,等等.这里,我们假设是单块cpu.也就是俗称的单核cpu. 大家可能会觉得这些 ...

  2. [Java] 垃圾回收 ( Garbage Collection ) 的步骤演示

    关于 JVM 垃圾回收机制的基础内容,可参考上一篇博客 垃圾回收机制 ( Garbage Collection ) 简介 上一篇博客,介绍了堆的内存被分为三个部分:年轻代.老年代.永生代.这篇博文将演 ...

  3. UVA10557- XYZZY(spfa+设置次数上限)

    题意:有N个房间,刚开始你位于1号房间,有100的能量值,你要到达N号房间,每两个房间之间有单向门相连接,你到达某个房间可以加上该房间的能量值, 如果你在未到达N号房间之前能量值耗尽,则死亡,否则胜利 ...

  4. 火狐解决 OCSP 回应包含过期信息的问题_firefox吧_百度贴吧

    火狐解决 OCSP 回应包含过期信息的问题_firefox吧_百度贴吧 火狐解决 OCSP 回应包含过期信息的问题

  5. 支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网

    支付宝开通海外退税 阿里腾讯暗战跨境O2O_21世纪网 支付宝开通海外退税 阿里腾讯暗战跨境O2O

  6. qt之treeview例子

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...

  7. Install Oracle 10g on Red Hat Linux 5.3 Step by Step

    一.虚拟机配置 1. 虚拟机(VBox 4.3.12) 2. 配置虚拟机网卡网络.选择host-only.VirtualBox Host-Only Network网卡IP为设置为192.168.1.1 ...

  8. 提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择

    一.分析  对于一个字符串进行拼接有三种方法:加号.concat方法.及StringBuiler或StringBuffer. 1."+"方法拼接字符串  str += " ...

  9. 【网络流#2】hdu 1533 - 最小费用最大流模板题

    最小费用最大流,即MCMF(Minimum Cost Maximum Flow)问题 嗯~第一次写费用流题... 这道就是费用流的模板题,找不到更裸的题了 建图:每个m(Man)作为源点,每个H(Ho ...

  10. python基础--杂项

    字符串格式化: ython的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-310 ...