先来看一个代码,估计很多同学都碰到过其中的某一个。

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a = ;
printf("a++ = %d\n", a++); a = ;
printf("++a = %d\n", ++a); a = ;
printf("a += a++ =%d\n", a += a++);
a = ;
printf("a += (a++) =%d\n", a = a + (a++)); a = ;
printf("a += ++a =%d\n", a += ++a);
a = ;
printf("a += (++a) =%d\n", a += (++a)); a = ;
printf("++a += a++ =%d\n", ++a += a++);
a = ;
printf("(++a) += (a++) =%d\n", (++a) += (a++)); return ;
}

估计很多同学都饱受摧残(T-T)。

更坑的是,卧槽不同编译器下会有不用的结果。(╯°口°)╯(┴—┴

a.VS2013下的运行结果

b.g++下的运行结果

从结果可以看出,除了最开始两个书本上教的a++与++a是一致的(a++是先取a值然后再执行a=a+1,++a是先a = a+1,在取a的值)外,其他很多都不相同。

(゚Д゚≡゚д゚)!?  这也能玩?

百思不得其姐,打开汇编代码一探究竟。
先来看下vs下的汇编(拍下脑子想下大一学的汇编):
/* vs2013 */
: printf("a += a++ =%d\n", a += a++);
011ECAC7 mov eax,dword ptr [a]     //把a的值放入eax寄存器中
011ECACA add eax,dword ptr [a]     //把a的值加到eax中(eax = eax+a )
011ECACD mov dword ptr [a],eax     //把eax的值放入a, 以上就是 += 的操作
011ECAD0 mov ecx,dword ptr [a]     //把a放入ecx寄存器中
011ECAD3 mov dword ptr [ebp-0D0h],ecx //直接打印了。。。--! 也就是忽略了a++ 直接打印了
011ECAD9 mov edx,dword ptr [a]     //接下来就是执行a++,以及以下基础操作了。
011ECADC add edx,
011ECADF mov dword ptr [a],edx
011ECAE2 mov esi,esp
011ECAE4 mov eax,dword ptr [ebp-0D0h]
011ECAEA push eax
011ECAEB push 11F832Ch
011ECAF0 call dword ptr ds:[11FC1E4h]
011ECAF6 add esp,
011ECAF9 cmp esi,esp
011ECAFB call __RTC_CheckEsp (011E1631h)
简单的分析了,发现vs中a++的操作放在最后面执行。
再来瞧瞧g++的汇编代码:
g++下汇编和vs下汇编有很大不同,最大的一个是
vs: mov a,b 指将b->a
g++: mov a,b 指将a->b
(我改了下顺序,你就不能说我抄袭了吧

c++(vs上)与g++(linux下)对于++操作的汇编代码解读的更多相关文章

  1. SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ...

  2. Linux下读写UART串口的代码

    Linux下读写UART串口的代码,从IBM Developer network上拿来的东西,操作比較的复杂,就直接跳过了,好在代码能用,记录一下- 两个实用的函数- //////////////// ...

  3. Linux下9种优秀的代码比对工具推荐

    大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...

  4. SSL握手通信详解及linux下c/c++ SSL Socket代码举例

    SSL握手通信详解及linux下c/c++ SSL Socket代码举例 摘自:http://www.169it.com/article/3215130236.html   分享到:8     发布时 ...

  5. Azure上如何在Linux下挂载数据磁盘

    [原文首次发表于51cto http://cloudapps.blog.51cto.com/3136598/1653672] 在Azure上创建了虚拟机之后,我们在一些情况下会需要添加更多的数据磁盘来 ...

  6. Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法

    catalog . 引言 . Linux平台上涉及的File IO操作 . Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件 ...

  7. Nginx入门篇-基础知识与linux下安装操作

    我们要深刻理解学习NG的原理与安装方法,要切合实际结合业务需求,应用场景进行灵活使用. 一.Nginx知识简述Nginx是一个高性能的HTTP服务器和反向代理服务器,也是一个 IMAP/POP3/SM ...

  8. 【转】Linux下mysql操作

    本文转自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/10/18/2216279.html 1.linux下启动mysql的命令:my ...

  9. linux下mysql操作的命令

    最近在学习mysql,还是只菜鸟,找到下面篇文章对初学者挺有用的,所以共享下 1.linux下启动mysql的命令:   mysqladmin start /ect/init.d/mysql star ...

随机推荐

  1. poj1785 Binary Search Heap Construction

    此题可以先排序再用rmq递归解决. 当然可以用treap. http://poj.org/problem?id=1785 #include <cstdio> #include <cs ...

  2. c++ list, vector, map, set 区别与用法比较

    http://blog.csdn.net/alex_xhl/article/details/37692297 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于ve ...

  3. python中字符串\r的奇怪问题

    示例: 我这里有一字符串: u'北京市工商行政管理局大兴分局\r <a onclick="showJDS(\'fa641bb3be5b44a1b618433833982fee\',\' ...

  4. uwsgi安装过程中遇到的问题

    参考这篇文章: [root@crz_oa webserver]# uwsgi --http :9090 --wsgi-file home.py --daemonize /var/log/uwsgi.l ...

  5. 湘潭 A simple problem

    A simple problem Accepted : 30   Submit : 303 Time Limit : 15000 MS   Memory Limit : 655360 KB Probl ...

  6. java学习容器

    自己模拟ArrayList: private Object[] elementData; private int size; // 可以指定集合大小,默认10 public MyArrayList(i ...

  7. flume系列之—flume ng使用demo

    摘自:http://rjhym.blog.163.com/blog/static/28130232201263042013972/

  8. TortoiseGit安装与配置

    TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...

  9. Linux内核中的GPIO系统之(3):pin controller driver代码分析

    一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...

  10. 【Unity3D游戏开发】性能优化之缩减打包压缩包大小 (二八)

    unity3d打包的所有文件是会被记录而且被排序的.所以这大大方便了我们分析为何打包文件如此之大,以及怎么减少打包文件. 日志目录一般在:C:\Users\Administrator\AppData\ ...