雅虎招聘考试中两道C++题目的疑问

   2026-02-06 00
核心提示:昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题: //1 intI=2; intx=(++I)+(++I)+(++I); //2 intI=2; intx=(I++)+(I++)+(I++);

昨天参加了雅虎校园招聘的在线考试,选择的语言类别是C++,其中遇到了这么两道题:

//<1>
intI=2;
intx=(++I)+(++I)+(++I);

//<2>
intI=2;
intx=(I++)+(I++)+(I++);

问分别执行两段代码后,x的值是多少?

在这里我不想去辛苦地求解,因为我认为这两道题是有问题的。为什么?

ANSIC标准告诉我们,如果一个单独的对象在相邻的序列点(sequencepoint,抱歉,我并不知道它的标准译名)之间被修改了两次或两次以上的话,那么结果是未定义的。可什么又是序列点呢?它的定义原文(参考[1],p255)如下:"Asequencepointisapointintheprogram’sexecutionsequenceatwhichallprevioussideeffectsofexecutionaretohavetakenplaceandatwhichnosubsequentsideeffectswillhaveoccurred."。翻译成中文就是:一个序列点是程序执行序列中的某个位置,在这个位置之前的(执行序列引发的)所有副效应在该点都将全部生效,而之后的(执行序列引发的)副效应则未发生。序列点会产生在以下三种地方(参考[1],p255):

(1)一个完全表达式(fullexpression)的结尾。其中完全表达式包括:initializer,表达式语句,return语句中的表达式部分,条件、循环、分支语句中的条件表达式部分(for语句的每个表达式也都包括在内);
(2)&&、||、?:和逗号操作符的第一个操作数的结尾;
(3)aftertheevaluationoftheargumentsandfunctionexpressioninafunctioncall(说实话,我没有弄懂这句话。如果一个函数调用表达式是另外一个函数调用的参数,那么这个作为参数的函数调用表达式的结尾是否是一个序列点呢?)。

对于第一段代码,根据序列点的定义,intI=2;结尾处是一个序列点(因为这是一个initializer)。同样地,intx=(++I)+(++I)+(++I);结尾处也是一个序列点,它们中间再无其它的序列点。这样针对同一个变量的3个(++I)操作就位于两个连续的序列点之间,根据ANSI标准,结果未定义。

所以严格来说,这两道题目是没法求解的,而且它还演示了一种非常糟糕的编程风格。

最后要指出的是,上述题目是属于C++考卷中的题,作者不清楚标准C++在这方面的定义是否与ANSIC不同,希望各位朋友能够补充相关信息。不过即使标准C++对此做了明确的规定,作者还是认为负责任的程序员都不应该写出这样的代码。

参考资料:

[1]《C:AReferenceManual》(影印版),
(著)SamuelP.Harbison,GuyL.Steele
人民邮电出版社,2003


来源:blog.csdn.net

 
举报收藏 0打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  用户协议  |  隐私政策  |  版权声明  |  网站地图  |  RSS订阅  |  今日物流资讯:2026-04-01