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

  1. #include <stdio.h>
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6. int a = ;
  7. printf("a++ = %d\n", a++);
  8.  
  9. a = ;
  10. printf("++a = %d\n", ++a);
  11.  
  12. a = ;
  13. printf("a += a++ =%d\n", a += a++);
  14. a = ;
  15. printf("a += (a++) =%d\n", a = a + (a++));
  16.  
  17. a = ;
  18. printf("a += ++a =%d\n", a += ++a);
  19. a = ;
  20. printf("a += (++a) =%d\n", a += (++a));
  21.  
  22. a = ;
  23. printf("++a += a++ =%d\n", ++a += a++);
  24. a = ;
  25. printf("(++a) += (a++) =%d\n", (++a) += (a++));
  26.  
  27. return ;
  28. }

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

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

a.VS2013下的运行结果

b.g++下的运行结果

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

  1. (゚Д゚≡゚д゚)!? 这也能玩?
  2.  
  3. 百思不得其姐,打开汇编代码一探究竟。
    先来看下vs下的汇编(拍下脑子想下大一学的汇编):
  1. /* vs2013 */
  2. : printf("a += a++ =%d\n", a += a++);
  3. 011ECAC7 mov eax,dword ptr [a]     //把a的值放入eax寄存器中
  4. 011ECACA add eax,dword ptr [a]     //把a的值加到eax中(eax = eax+a )
  5. 011ECACD mov dword ptr [a],eax     //把eax的值放入a, 以上就是 += 的操作
  6. 011ECAD0 mov ecx,dword ptr [a]     //把a放入ecx寄存器中
  7. 011ECAD3 mov dword ptr [ebp-0D0h],ecx //直接打印了。。。--! 也就是忽略了a++ 直接打印了
  8. 011ECAD9 mov edx,dword ptr [a]     //接下来就是执行a++,以及以下基础操作了。
  9. 011ECADC add edx,
  10. 011ECADF mov dword ptr [a],edx
  11. 011ECAE2 mov esi,esp
  12. 011ECAE4 mov eax,dword ptr [ebp-0D0h]
  13. 011ECAEA push eax
  14. 011ECAEB push 11F832Ch
  15. 011ECAF0 call dword ptr ds:[11FC1E4h]
  16. 011ECAF6 add esp,
  17. 011ECAF9 cmp esi,esp
  18. 011ECAFB call __RTC_CheckEsp (011E1631h)
  1. 简单的分析了,发现vsa++的操作放在最后面执行。
    再来瞧瞧g++的汇编代码:
    g++下汇编和vs下汇编有很大不同,最大的一个是
    vs: mov a,b 指将b->a
    g++: mov a,b 指将a->b
    (我改了下顺序,你就不能说我抄袭了吧
  2. c++(vs上)与g++(linux下)对于++操作的汇编代码解读的更多相关文章

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

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

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

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

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

      1. WindowsLinux下文件操作(写、删除)错误的产生原因、及解决方法
      1. catalog . 引言 . Linux平台上涉及的File IO操作 . Windows平台上涉及的File IO操作 0. 引言 本文试图讨论在windows.linux操作系统上基于C库进行文件 ...

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

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

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

    1.  
    2. 随机推荐

        1. YTU 3013: 皇后问题(递归)
        1. 3013: 皇后问题(递归) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...

        1. mysql一些常用命令总结
        1. mysql时间戳转日期格式SELECT FROM_UNIXTIME(add_time,'%Y-%m-%d %H:%i:%s') FROM `wh5_username` where id=23; in ...

        1. HDU(3790),最短路二级标准
        1. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    ...

        1. 20161029 星期六 --出埃及记 Exodus 19:14
        1. 20161029 星期六 --出埃及记 Exodus 19:14 After Moses had gone down the mountain to the people, he consecr ...

        1. strtr介绍
        1. strtr  转换指定字符 string strtr ( string $str , string $from , string $to ) string strtr ( string $str , ...

        1. Eclipse搭建Android5.0应用开发环境 ndk-build”:launchingfailed问题解决
        1. Eclipse搭建Android5.0应用开发环境 "ndk-build":launchingfailed问题解决 详细参考http://blog.csdn.net/loongem ...

        1. Unity3D游戏开发】性能优化之spine提高80~90%的效率 (三一)
        1. Spine效率低 Unity项目加载spine动画,经常会出现卡顿的情况,如游戏中瞬间播放一个动画,打开一个带spine动画的界面.尤其是SkeletonRenderer.Awake时,会瞬间出现大量 ...

        1. marklinux 终端命令行下的快捷键(自己已验证所有)
        1. 说明: \c + a:表示ctrl+a \a + a:表示alt+a 命令列表: 1 移动: \c + a:将光标移到行首 \c + e:将光标移到行尾 \c + f:将光标向后(右)移动一个字符 \ ...

        1. DevExpress所有的窗体,使用同一款皮肤
        1. https://www.devexpress.com/Support/Center/Question/Details/K18516 To accomplish your task, please ex ...

        1. 精通正则表达式(第三版)——Mastering Regular Expressions,3rd Edition——读书笔记1
        1. 基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([0 ...