首先不要被人蒙了,如果是这样,根本编译不过:

int i=1;
int b=i+++++i;
printf("%d %d\n", b ,i);

Mingw报错:error: lvalue required as increment operand (好像是说,++缺左值,这里的++是上题的第三第四个加号)

VC2010报错:error C2105: '++' needs l-value

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

正确的面试题应该是这样:

int i=1;
int b=i++ + ++i;
printf("%d %d\n", b ,i);

我没做过编译器,只能从以往学过的知识猜:

前提,这个语句里有三个表达式,分别是 i++ (exp1), ++i (exp3), exp+exp3 = exp2

1. 记得以前if语句有多个条件的时候,开启优化开关,一旦第一个条件成立,后面的条件就有可能不评估了,这说明编译器对表达式是从左往右分析的。

2. exp1 = i++要在当前整个语句执行完毕以后才执行。如果这句语句有多个函数或者内含多个表达式,就应该等待这些表达式全部计算完毕,才执行++操作。

3. 这一行里表达式 i++ (exp1),,和 ++i (exp3),使用的是同一个i,因此如果在整个语句结束之前,其中一个表达式计算的值会影响另一个表达式的值。

综合上面分析:先执行++i (exp3),执行后i=2; 然后执行 b = exp1 + exp3 = i + i = 2 + 2 = 4; 最后执行exp1 = i++ = 2+1 = 3

结果:MingW和VC2010的结果都是4,3,被我都蒙对了。记住两点:表达式从左往右执行,多个表达式共用一个变量相互影响(而不是各个表达式被分割以后,进行封闭式计算。内存里始终只有一个i,而编译器也不应该自作主张加上锁,或者做多份内存拷贝,如果刻意想要的效果,应该是由程序员来做这个工作,编译器不应该越俎代庖)

没做过编译器就是被人欺——从一道变态的i++题猜编译器的行为(表达式从左往右扫描,同一变量相互影响)的更多相关文章

  1. 【腾讯敏捷转型No.5】需求没做完可以发布嘛

    很多人对于敏捷的第一直觉就是“快”,开发快,测试快,发布快,并不知道如何把这个“快”应用到敏捷实践中,下面我们来分析一下导致工作效率低的核心原因.没有使用敏捷之前,在大多数情况下,项目管理都需要开各种 ...

  2. 阿里云“网红"运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...

  3. 阿里云“网红"运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...

  4. 产品专家Marty Cagan:不做仅仅会编码的人

    Marty Cagan是享有世界声誉的产品管理专家,曾担任Netscape副总裁.eBay产品管理及设计高级副总裁. 近日,记者在"PM-China首届产品经理高峰论坛"上对他做了 ...

  5. 关于一些没做出来的SBCF题

    这里是一些我SB没做出来的CF水题. 其实这些题思维量还不错,所以写在这里常来看看…… 不一定每题代码都会写. CF1143C Queen 其实只要注意到如果一个点开始能被删,那一直就能被删:一个点开 ...

  6. 在vc6.0下编的对话框界面如果没做过其他处理,往往显的很生硬,怎么样才能使他有Windows XP的风格呢,其实也很简单,我们来看看下面两种方法。

    在vc6.0下编的对话框界面如果没做过其他处理,往往显的很生硬,怎么样才能使他有Windows XP的风格呢,其实也很简单,我们来看看下面两种方法.    方法一: 1.首先确认你在Windows   ...

  7. 人物传记Daniel Bolsonaro:永远不要做一个思维单一的人

    从小经历了移民和不断辗转迁徙搬家的Daniel Bolsonaro(现就职于灵石团队,职位是核心技术架构师)知道,人生不可能只有一条路,也不要局限于只给自己设立一条路.既然父母能带自己离开巴西来到美国 ...

  8. MacOs 10.14.3 Matlab2018b 解决“找不到已安装的编译器 'Xcode Clang++'。错误使用mex,未找到合适的编译器”问题

    这是目前网上state of the art 的解决方案: 最开始用的是matlab2017,结果爆了这么一个问题“找不到已安装的编译器 'Xcode Clang++'.错误使用mex,未找到合适的编 ...

  9. 为啥我做的RFM模型被人说做错了,我错哪了?

    本文转自知乎 作者:接地气的陈老师 ————————————————————————————————————————————————————— 有同学问:“为啥我做的RFM模型被客户/业务部门批斗,说 ...

随机推荐

  1. MyFramework框架搭建(一)DAL层

    一直以来有一个想法,搭建一个属于自己的框架,将自己学到的东西整合到框架里,不断的完善,让它随着我的成长而成长,下面介绍我第一阶段的总结:DAL层搭建 一.基础配置 1.我用的是Ibatis.net框架 ...

  2. iOS-开发记录-UIView属性

    UIView属性 1.alpha 设置视图的透明度.默认为1. // 完全透明 view.alpha = ; // 不透明 view.alpha = ; 2.clipsToBounds // 默认是N ...

  3. OC与Swift的区别五(函数)

    13 函数 oc函数定义: 返回值类型 函数名(参数类型 参数名,参数类型 参数名){ } swift 函数定义: func 函数名(参数名:参数类型,参数名:参数类型) -> 返回值类型{ } ...

  4. vi 或 vim 常用命令(简单够用了)

    1.vi filename :打开或新建文件,并将光标置于第一行首 2.按下i键:编辑或插入数据3.按下shit+: ->表示可以进行命令输入 4.q! ->表示不保存退出.5.w -&g ...

  5. 九度OJ 1202 排序 -- 堆排序

    题目地址:http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=10 ...

  6. 九度OJ 1079 手机键盘

    题目地址:http://ac.jobdu.com/problem.php?pid=1079 题目描述: 按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次, ...

  7. 网站开发常用jQuery插件总结(六)关键词说明插件cluetip

    我们开发的网站,总有它一定的用途.如企业站用来宣传企业或展示产品,技术站用来分享自己的思路和经验.既然网站有了它的用途,那么就拥有了它本身的关键词(关键词说明网站的主要内容).例如企业站的关键词大部分 ...

  8. centos VM 识别U盘

    在VM设置选项中,选择 USB Controller 选项,设置相关参数即可

  9. AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM

    DropGG.com is the destination for savvy shoppers looking to save money by buying smart. DropGG.com a ...

  10. 苹果ios、ipad加密视频播放器使用教程

    操作流程 温馨提示 播放时,请务必保证播放设备联网(原因:用户名权限验证需要网络,播放后10秒即可关闭网络) a)     请在苹果商店下载并安装app播放器:DrmPlayer b)     选择已 ...