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

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

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,而编译器也不应该自作主张加上锁,或者做多份内存拷贝,如果刻意想要的效果,应该是由程序员来做这个工作,编译器不应该越俎代庖)

时间: 2024-10-22 05:01:48

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

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

首先不要被人蒙了,如果是这样,根本编译不过: 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 --------------------------------------------------

考考你有没做生意天赋

王小姐是卖鞋的,一双鞋进货价45元,甩卖30元,顾客来买两双鞋给了张100元,王小姐没零钱,于是找邻铺换了100元.(事后邻铺发现钱是假的,王小姐又赔了邻铺100元) 请问王小姐一共亏了多少元?(这道题目不简单,到底亏了多少?这套题曾在各种群里做过测试,100人的群,半个小时之内只有1个人答对.) 解题思路: 钱的总量是一定的,不会多不会少.也就是说,别人赚的钱,就是你亏的钱.所以,抓住收支平衡这个原理,分析下3个人的收入和支出就可以轻松解决此题. 答案:130

小米平板体验:做了苹果没做的塑料平板

IT之家(www.ithome.com):小米平板体验:做了苹果没做的塑料平板 15日,雷军在北京国际会议中心的小米新品发布会上,公布了全新的小米平板.在发布会后人群在产品体验区排起了长龙,排了足足25分钟的队后我拿起小米平板进行体验,但由于外面仍有大量的人未进场,整个试用过程仅有可怜的3分钟. 进入微软.亚马逊,谷歌等美国IT企业工作人才项目,起薪40万,百度搜索(MUMCS) 其实在整场发布会上,我仿佛有了种雷军重新发布了一次iPad mini的感觉.不仅是雷军在整场发布会上多次提及苹果,包

产品专家Marty Cagan:不做只会编码的人

Marty Cagan是享有世界声誉的产品管理专家,曾担任Netscape副总裁.eBay产品管理及设计高级副总裁.近日,记者在"PM-China首届产品经理高峰论坛"上对他做了专访,请他分享自己的产品管理历程. 程序员的工作 <程序员>:据我所知,您先后毕业于加州大学和斯坦福大学.这两段经历有何不同? Marty Cagan:像这个行业的大多数人一样,我在加州大学修了计算机科学专业:后来我又去斯坦福大学修了一个类似于MBA的专业,那个专业的学费相当昂贵,学习的是商务方面的

C++编译器最烦人的分析机制

 下面这行代码声明了一个带double参数并返回int的函数: int f(double d); 下面这行做了同样的事情,参数d两边的括号是多余的,会被忽略: int f(double (d)); 下面这行声明了同样的函数,只是它省略了参数名称: int f(double); 这三种形式除了第二种,我们应该都很熟悉. 下面我们在看三个函数声明.第一个声明了一个函数g,它的参数是一个指向不带任何参数的函数的指针,该函数返回double值: int g(double (*pf)()); 有另外一

郝小亮-读王坚《在线》:互联网能做的和没做的事还有很多

王坚博士是我所见过的互联网公司管理层中,为数不多的能够将演讲做到不使台下观众犯困的人之一,更何况他所演讲的内容大多与艰涩难懂的技术相关.这当然算得上是一项优于常人的能力,尽管在这方面阿里巴巴集团董事局主席同时也是王坚的上级,马云的能力要远在其之上. 在为<在线>一书所做的序中,马云如此评价王坚:“假如我们的博士是程序员出身,那么阿里的CTO可能和任何公司的CTO毫无区别.”倘若王坚与大多数CTO无异,那么<在线>这本书多半不会引起我的兴趣,可以想象阅读一本用专业术语与严肃口吻讲解某

学好技术,做一个不浮躁的人,请记住以下几点

浮躁的人容易问:我到底该学什么----别问,学就对了: 浮躁的人容易问:Java有钱途吗:----建议你去抢银行: 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人:只学而不坚持的人: 浮躁的人永远不是一个高手 1.不要看到别人的回复第一句话就说:给个代码吧!你应该想想为什么.当你自己想出来再参考别人的提示,你就知道自己和别人思路的差异. 2.初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是

做一个内心安静的人,不骄不躁,且行且乐

做一个内心安静的人,不骄不躁,且行且乐 安静是一种天然的存在,年龄长久的提炼和沉寂,让内心更为充盈,是生命摆脱浮躁而逐渐趋于安静. 安静是从最深的绝望处寻找到的最美丽的惊喜,这是一种成熟人生的境界,一种充满乐趣的安静,怎么品味都有情趣. 一个人,若想在不同的人生阶段有所得,有所悟,有所成就,绝对离不开一个静字. 静,不是让你脱离现实,而是要在现实中有一种淡定的姿态,去看清自己的本质,只有看请自己的本质,才能清楚的提升自己. 浅薄的热闹,丰富的安静,后者会更让人倾心.静者不避闹市,躁者难立深山,充

hdu--4432--好久没做题了.

很久没做题了...一想到要去 遥远的 牡丹江 我就------------- 这题 没什么好说的 就是个十进制的数转换成任意进制的数 就是要注意下 10进制以上的数 10是表示为A 11表示为B ......... 好 贴代码 继续做一两题. 1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 vector<int>ve; 6 int num[110]; 7 int sum , n ,