LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: alvas

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

 关闭 [复制链接]
发表于 2005-11-27 23:25:30 | 显示全部楼层
Post by xufan106
好像不是这样;

我试了一下
  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
复制代码


这个和我说的有区别吗?从第三个开始才是加上(++i)当时的值

Post by MatthewGong
第一步 ++i,使i=3,返回i的“引用”
第二步 ++i,使i=4,返回i的“引用”
第三步 i的“引用”+i的“引用”,返回临时变量,值为4+4=8
第四步 ++i,使i=5,返回i的“引用”
第五步 临时变量+i的“引用”,8+5=13
第六步 返回表达式的值13

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


MatthewGong说的是
前缀式:
template<class T> T& operator++();
后缀式:
template<class T> T operator++(int);

这点居然忘了,惭愧……
补基础……
回复 支持 反对

使用道具 举报

发表于 2005-11-28 11:37:50 | 显示全部楼层
Post by ssbeonly
在不同的编译器得出的结果是不同的..

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


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

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



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

赞同,这应该是无定义行为的语句。
回复 支持 反对

使用道具 举报

发表于 2005-11-28 12:13:00 | 显示全部楼层
visual studio 2005 我这里是15啊~~~
回复 支持 反对

使用道具 举报

发表于 2005-11-28 13:45:12 | 显示全部楼层
都说了是和编译器对表达式中各个操作数的求值顺序有关,不同的编译器对这类表达式得出的结果是不一样的。
这类题目到底有什么意义??
回复 支持 反对

使用道具 举报

发表于 2005-11-28 14:05:56 | 显示全部楼层
++i返回的是i的引用,
不同的求值顺序造成不同的结果,如果先把()里面的++i先算完就成了5+5+5所以VS 2005给出的答案是15。

这样的题目意义在于告诉人们这样做是和编译器有关的,你在写程序的时候不要写出这样的代码,否则就不具有移植性了。我说得对吗?
回复 支持 反对

使用道具 举报

发表于 2005-11-28 16:32:21 | 显示全部楼层
讨论这种问题没什么意思,和具体的环境相关
回复 支持 反对

使用道具 举报

发表于 2005-11-28 17:10:02 | 显示全部楼层
C语言标准里对于这种情况的定义只有一个词:
UNDEFINED

This problem is entirely compiler dependent
In order to avoid trouble and keep the program simple, always put ++ and -- on a line by themselves.

希望版主把这个问题置顶
不要再问了
求求各位了
oh, ****
回复 支持 反对

使用道具 举报

发表于 2005-11-28 17:44:03 | 显示全部楼层
嗯,事实上没有人这么写代码的.这样的代码只会出现在考卷上,但就是有很多人喜欢研究这个东西(我刚学c的时候也喜欢搞搞这些东西),正如zhllg所说,这个是undefined.

这种东西娱乐娱乐可以,不要太认真就行了 ^_^
回复 支持 反对

使用道具 举报

发表于 2005-11-28 22:59:52 | 显示全部楼层
我的意见不太一样,虽然我认为讨论这个问题的答案是没有意义的。但是这个问题本身还是有意义的——怎样避免写出未定义的代码呢
回复 支持 反对

使用道具 举报

发表于 2005-11-28 23:39:09 | 显示全部楼层
找本好书来学习就好了

the c programming language
practical c programming
这两本都有提到
回复 支持 反对

使用道具 举报

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

本版积分规则

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