LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3208|回复: 40

i=2,(++i)+(++i)+(++i),最后求结果,在fc4中得13

 关闭 [复制链接]
发表于 2005-11-27 20:04:11 | 显示全部楼层 |阅读模式
今天在太平洋网看到yahoo的一道招聘题目,i=2,(++i)+(++i)+(++i),最后求结果,觉得很普通,但是我在fc4下用gcc编译后,运行结果却让我大吃一惊。居然等于13,而且i最后等于5.大家知道是怎么回事吗?
发表于 2005-11-27 20:32:20 | 显示全部楼层
3+4+5=12 ?
回复 支持 反对

使用道具 举报

发表于 2005-11-27 20:35:34 | 显示全部楼层
挺有意思……

个人认为可能是这样:
连加实际被分解为多个+操作。因此,表达式
(++i)+(++i)+(++i)
可能被解释为类似
x1 = (++i)+(++i);
x2 = x1 + (++i);   // x1, x2为临时变量
的形式。
对于第一个表达式,情况比较特殊。在分析(++i)+(++i)的时候,分析完第二个++i之后,++i返回的值为4,而+号两边的两个表达式都是(++i),可能编译器会认为两个(++i)应该具有相同的值,所以假设的x1的值就是4+4=8了。而之后x2就不存在这个问题,因此x2=8+5=13。

待知情者批判之……
回复 支持 反对

使用道具 举报

发表于 2005-11-27 20:47:48 | 显示全部楼层
在Java中的输出是sum=12,i=5...
回复 支持 反对

使用道具 举报

发表于 2005-11-27 20:52:14 | 显示全部楼层
在不同的编译器得出的结果是不同的..

继续讨论没有意义,YAHOO的题就一定没有错误吗?


敢问楼主一句:你觉得这个题目普通?

....哪个人会这么写?



楼上"这个题目是C++的""
现在觉得Java真好....不会出现此类情况.
回复 支持 反对

使用道具 举报

发表于 2005-11-27 20:54:10 | 显示全部楼层
Post by kinton
在Java中的输出是sum=12,i=5...

看来java是分析成
int x=0;
x += ++i;
x += ++i;
x += ++i;
回复 支持 反对

使用道具 举报

发表于 2005-11-27 22:22:38 | 显示全部楼层
c++语言
i=2,(++i)+(++i)+(++i) 应该是

i=2;
++i;  //i=3
++i;  //i=4
++i;  //i=5
最后i=5,(++i)+(++i)+(++i)=3+4+5=12  ?
回复 支持 反对

使用道具 举报

发表于 2005-11-27 22:51:22 | 显示全部楼层
在GF的机器上用vc++6试了试,也是13!
在我的fc4下gcc也是13。
呵呵,汗
回复 支持 反对

使用道具 举报

发表于 2005-11-27 22:51:34 | 显示全部楼层
Post by manphiz
挺有意思……


连加实际被分解为多个+操作。因此,表达式
(++i)+(++i)+(++i)
可能被解释为类似
x1 = (++i)+(++i);
x2 = x1 + (++i);   // x1, x2为临时变量
的形式。
对于第一个表达式,情况比较特殊。在分析(++i)+(++i)的时候,分析完第二个++i之后,++i返回的值为4,而+号两边的两个表达式都是(++i),可能编译器会认为两个(++i)应该具有相同的值,所以假设的x1的值就是4+4=8了。而之后x2就不存在这个问题,因此x2=8+5=13。

待知情者批判之……


好像不是这样;

我试了一下
  1. #include<iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. int i=2;
  6. cout <<"(++i)+(++i)+(++i)+(++i)+(++i)="<<(++i)+(++i)+(++i)+(++i)+(++i)<<"  ;  i="<<i<<endl;
  7. i=2;
  8. cout <<"(++i)+(++i)+(++i)+(++i)="<<(++i)+(++i)+(++i)+(++i)<<"  ;  i="<<i<<endl;
  9. i=2;
  10. cout <<"(++i)+(++i)+(++i)="<<(++i)+(++i)+(++i)<<"  ;  i="<<i<<endl;
  11. i=2;
  12. cout <<"(++i)+(++i)+0="<<(++i)+(++i)+0<<"  ;  i="<<i<<endl;
  13. i=2;
  14. cout <<"(++i)+(++i)="<<(++i)+(++i)<<"  ;  i="<<i<<endl;
  15. i=2;
  16. cout <<"(++i)="<<(++i)<<"  ;  i="<<i<<endl;
  17. return 0 ;
  18. }
复制代码


输出为


  1. (++i)+(++i)+(++i)+(++i)+(++i)=26  ;  i=7
  2. (++i)+(++i)+(++i)+(++i)=19  ;  i=6
  3. (++i)+(++i)+(++i)=13  ;  i=5
  4. (++i)+(++i)+0=8  ;  i=4
  5. (++i)+(++i)=8  ;  i=4
  6. (++i)=3  ;  i=3
复制代码
回复 支持 反对

使用道具 举报

发表于 2005-11-27 22:58:44 | 显示全部楼层
第一步 ++i,使i=3,返回i的“引用”
第二步 ++i,使i=4,返回i的“引用”
第三步 i的“引用”+i的“引用”,返回临时变量,值为4+4=8
第四步 ++i,使i=5,返回i的“引用”
第五步 临时变量+i的“引用”,8+5=13
第六步 返回表达式的值13

这里的关键是前置++返回的是“引用”!!!!
你重载operator++()时有没有注意过这一习惯作法?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表