设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道|Google Chrome 参与WS-AT全局事务
您现在的位置: 天极网 > 软件频道 > IT教育频道 > 培训辅导 > Yahoo招聘考试中两道C++题目的疑问
全文

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

2005-11-25 09:07作者:出处:责任编辑:罗可龙

培训辅导    培训动态    精品课程    名校展台    教育资讯    天极教育   主题社区   

微软认证 | 思科认证 | 软考认证 | 等级考试 | Oracle认证 | Java认证| 职场动态 | 招聘信息| 求职信息

  昨天参加了雅虎校园招聘的在线考试,选择的语言类别是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++对此做了明确的规定,作者还是认为负责任的程序员都不应该写出这样的代码。


  

培训辅导    培训动态    精品课程    名校展台    教育资讯    天极教育   主题社区   

微软认证 | 思科认证 | 软考认证 | 等级考试 | Oracle认证 | Java认证| 职场动态 | 招聘信息| 求职信息

阅读关于 Yahoo 招聘 考试 C++题目 疑问 的全部文章
相关搜索:
相关文章及软件
关注此文读者还看过
热门关注
特别推荐
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众