源码

#include "stdio.h"int main(void)
{int i = 1;printf("%d\n",(++i) +(++i));return 0;
}

执行

weiqifa@bsp-ubuntu1804:~/c/undif$ gcc g.c && ./a.out
6
weiqifa@bsp-ubuntu1804:~/c/undif$

为什么出现这个鬼现象?

原因很简单,C语言的法律里面没有定义这条规格,这个属于C语言的未定义行为,也就是擦边球,什么是擦边球呢?就是这些行为不是错误的行为,法律没有明确定义的,所以就是擦边球。

它的执行顺序是这样的

int i = 1;
++i ;//i = 2
++i ;//i = 3
i + i ; //输出6

反汇编看看

weiqifa@bsp-ubuntu1804:~/c/undif$ gcc -S g.c
weiqifa@bsp-ubuntu1804:~/c/undif$ cat g.s.file   "g.c".text.p        .rodata
.LC0:.string "%d\n".text.globl  main.type   main, @function
main:
.LFB0:.cfi_startprocpushq   %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq    %rsp, %rbp.cfi_def_cfa_register 6subq    $16, %rspmovl    $1, -4(%rbp)addl    $1, -4(%rbp)addl    $1, -4(%rbp)movl    -4(%rbp), %eaxaddl    %eax, %eaxmovl    %eax, %esileaq    .LC0(%rip), %rdimovl    $0, %eaxcall    printf@PLTmovl    $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size   main, .-main.ident  "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0".p        .note.GNU-stack,"",@progbits
weiqifa@bsp-ubuntu1804:~/c/undif$ ls

我们不用关注所有的代码,分析下面几行关键的

subq    $16, %rsp
movl    $1, -4(%rbp) //相当于 i = 1
addl    $1, -4(%rbp) //相当于 i +1
addl    $1, -4(%rbp) //相当于 i +1
movl    -4(%rbp), %eax // 把rbp寄存器传给eax寄存器
addl    %eax, %eax //相当于 i + i

看完这个代码后,应该知道为啥输出的是 6 了吧?

最后

我认为一个是编译器执行顺序的问题,反汇编无非就是搞清楚C的执行顺序,而且我认为研究这个是有意义的,不过有意义不代表可以这样写代码。

C本身是偏底层的东西,了解编译的原理和过程是非常重要的。

但是了解也不能这样瞎用,还是要遵守规则,要不然,这样导致的bug估计要害死很多人。

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

嵌入式Linux

微信扫描二维码,关注我的公众号

i=1,为什么 (++i)+(++i)=6?相关推荐

  1. 设有关系模式R(A,B,C,D),其上的函数依赖集: F={A→C,C→A,B→AC,D→AC}

    设有关系模式R(A,B,C,D),其上的函数依赖集: F={A→C,C→A,B→AC,D→AC} (1).计算(AD)+. (2).求F的最小等价依赖集Fm. (3).求R的关键字. (4).将R分解 ...

  2. [经验总结]源代码管理=Ubuntu+Apache+SVN

    http://blog.csdn.net/thinkhy/article/details/4598630 最近公司的Windows服务器中毒了,同事决定改用Linux.听说我以前弄过Linux,且还比 ...

  3. 网易=4 ×(新浪 + 搜狐)

    PMCAFF(pmcaff.com):最大互联网产品社区,是百度,腾讯,阿里等产品经理的学习交流平台.定期出品深度产品观察,互联产品研究首选. 本文由PMCAFF观点栏目原创发布.未经许可,禁止转载. ...

  4. 导师 = advisor + supervisor

    在英语地区/国家,研究生"导师"常被称为 advisor 或 supervisor.  我觉得, 导师 = advisor + supervisor. 在研究生入学初.中期,导师起 ...

  5. ax的范数最大_矩阵方程ax=b的范数约束最小二乘解.pdf

    矩阵方程ax=b的范数约束最小二乘解 第 卷 第 期 桂林电子科技大学学报 , 33 1 Vol.33 No.1 年 月 2013 2 JournalofGuilinUniversit ofElect ...

  6. 产品经理懂技术=流氓会武术(zz)

    最近七年,我都在做互联网产品,其中前五年分别在创业公司和上市公司里,做别人的产品:近两年在创业,做自己的产品. 我的体会是:产品经理需要懂技术,创业者尤其需要.但前提是你总觉得有股憋不住的想要做点儿什 ...

  7. 烧脑又过瘾!关于c²= b² + a²,你不知道的N个事实

    全世界只有3.14 % 的人关注了 爆炸吧知识 勾股定理 你真的懂吗 一般人看来,勾股定理只存在于特定的三角形或几何图形中. 但实际上,绝大多数人都小看了这条有2600年历史的公式,很多看似不可能的图 ...

  8. 颠覆认知!关于c²= b² + a²,你不知道的N个事实

    全世界只有3.14 % 的人关注了 青少年数学之旅 数是什么?毕达哥拉斯会告诉你,数是众神之母,万物之源 --节选自 <数学之旅·闪耀人类的54个数学家> 一般人看来,勾股定理只存在于特定 ...

  9. python高阶函数闭包装饰器_5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器...

    一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰 ...

  10. 发布在线文档【软件=业务+架构+流程+组织.pptx】

    10年的技术工作,软件这个词对我来说一点都不陌生,但是当我问自己如何理解软件的?我却不知道如何回答.软件=业务+架构+流程+组织,其中公式是借用软件产品线工程BAPO的概念,我觉得不错,这个ppt就是 ...

最新文章

  1. 分布式文档系统-document id的手动指定与自动生成两种方式解析(来自学习笔记:龙果学院ES课程)
  2. [JavaScript] 多数前端工程师都没注意到的一个关于console.log()的坑
  3. Java中数组在内存中的存放原理?
  4. 二分查找找下标或者值
  5. java 文件上传 servlet_java文件上传-原始的Servlet方式
  6. Win XP文件夹拒绝访问的解决方法 - 年轻无极限 - 51CTO技术博客
  7. Django项目部署:使用uwsgi和nginx的方式
  8. 金蝶k/3 K3云之家消息查询发送是否成功SQL语句
  9. 关于恶意DNS请求监控的一点小思路
  10. 提起海洋和通海水域污染损害赔偿诉讼主体的几个层面
  11. helm开发环境部署gitea
  12. 无法打开csproj,因为此版本的应用程序不支持其项目类型 csproj
  13. 微信公众号的申请以及测试号的申请
  14. 基于httpx和pyside2的哔哩哔哩(bilibili)-视频下载程序
  15. AndroidStudio 个人总结的快捷键
  16. 【SpringCloudAlibaba学习 04】整合Dubbo(实现数据消费者服务调用数据生产者服务)
  17. 架构师工资一月多少钱
  18. JSON的两种方法JSON.parse()、JSON.stringify()
  19. Qt实现路径渐变,绘制彩色的线条
  20. 视频网站忙结盟 酷6逆势转型SNS视频模式

热门文章

  1. 求 s=a+aa+ aaa+ aaaa +aaaaa+........的值,a是从键盘输入的,项数也为键盘输入
  2. ios 图片添加阴影
  3. jquery-autocomplete学习(转)
  4. 迅雷的声音:摆脱视频产业的经济化困境
  5. Oracle数据库自动存储管理(ASM)
  6. 就算是蜗牛,也有爬到树顶的那一天!~
  7. 搞了个30天学习量化的数据资料,可以bt做全球。数据链接白送
  8. 真格量化——50etf与期权对冲策略
  9. 网络爬虫--11.XPath和lxml
  10. 学成在线--2.CMS前端页面查询开发