昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题:
来源:互联网 发布:印度废钞 知乎 编辑:程序博客网 时间:2024/05/01 07:13
昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题:
//<1>
int I = 2;
int x = (++I) + (++I) + (++I);
//<2>
int I = 2;
int x = (I++) + (I++) + (I++);
问分别执行两段代码后,x的值是多少?
在这里我不想去辛苦地求解,因为我认为这两道题是有问题的。为什么?
ANSI C标准告诉我们,如果一个单独的对象在相邻的序列点(sequence point,抱歉,我并不知道它的标准译名)之间被修改了两次或两次以上的话,那么结果是未定义的。可什么又是序列点呢?它的定义原文(参考[1], p255)如下: "A sequence point is a point in the program's execution sequence at which all previous side effects of execution are to have taken place and at which no subsequent side effects will have occurred." 。翻译成中文就是: 一个序列点是程序执行序列中的某个位置,在这个位置之前的(执行序列引发的)所有副效应在该点都将全部生效,而之后的(执行序列引发的)副效应则未发生。序列点会产生在以下三种地方(参考[1], p255):
(1) 一个完全表达式(full expression)的结尾。其中完全表达式包括: initializer,表达式语句,return语句中的表达式部分,条件、循环、分支语句中的条件表达式部分(for语句的每个表达式也都包括在内);
(2) &&、||、?:和逗号操作符的第一个操作数的结尾;
(3) after the evaluation of the arguments and function expression in a function call (说实话,我没有弄懂这句话。如果一个函数调用表达式是另外一个函数调用的参数,那么这个作为参数的函数调用表达式的结尾是否是一个序列点呢?)。
对于第一段代码,根据序列点的定义,int I = 2;结尾处是一个序列点(因为这是一个initializer)。同样地, int x = (++I) + (++I) + (++I);结尾处也是一个序列点,它们中间再无其它的序列点。这样针对同一个变量的3个(++I)操作就位于两个连续的序列点之间,根据ANSI标准,结果未定义。
所以严格来说,这两道题目是没法求解的,而且它还演示了一种非常糟糕的编程风格。
最后要指出的是,上述题目是属于C++考卷中的题,作者不清楚标准C++在这方面的定义是否与ANSI C不同,希望各位朋友能够补充相关信息。不过即使标准C++对此做了明确的规定,作者还是认为负责任的程序员都不应该写出这样的代码。
- 昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题:
- 昨天参加嵌入式工程师的考试了
- 昨天刚参加了pmp考试
- 昨天参加北京的招娉会了
- 昨天参加ti的研讨会了
- 今天报名参加CPA的考试了
- 刚刚参加了BEC Preliminary 的考试
- 【校园招聘】被南瑞集团坑了,这么大的公司竟然不讲信用!大家不要再上当受骗了!
- 一年一度的校园招聘开始了,很烦
- 昨天参加了中天的年度尾牙聚会
- 昨天参加了出版社的open party,挺有收获
- 昨天参加了Tencent的微简历大赛
- [转]参加淘宝校园招聘的感受
- 昨天看了云风的技术文章,今天看了金点的技术文章,选择c/c++是个不错的起步
- 今天参加招聘了
- 今天参加了一场学校举办的招聘会
- 参加了2015山西移动招聘后的经验分享
- 昨天遇到了linux 一个问题 以为是改hostname 的值 ,但是不是
- Log4j基本使用方法
- GRDB v7.2 by LADsoft
- WinAsm Studio v5.1.1.0 by Antonis Kyprianou
- 当 Hibernate 遇上 Spring
- [原创]在button上跳舞
- 昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题:
- window 常用快截键
- java_install_linux
- Sting类
- UI-Less Parser(跳过IE脚本执行-自解)
- J2ME程序开发全方位基础讲解汇总
- 2006年的第一天
- 2006年
- 虚拟机VMare Workstation的使用,以及如何在虚拟Linux中访问Windows宿主文件,分区.(转载)