| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 686 人关注过本帖
标题:这结果为何是这样啊,求解释
只看楼主 加入收藏
a99875984
Rank: 2
等 级:论坛游民
帖 子:188
专家分:24
注 册:2012-2-11
收藏
得分:0 
回复 8楼 qunxingw
说的太多了哈,不尽让我想起没上大学前
老师问:同学们都懂了吗?
学生:都懂了。
其实有多少都懂?
哎,我该庆幸有好奇心去问现在这问题
2012-10-09 13:10
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:2 
在同一表达式里,如果有多次对一个变量的自增或自减操作,编译器不保证它的执行顺序,在GCC里的输出和LZ的输出一样,但在VC9.0里这段代码的输出是
1
1
1
4
也就是说,编译器只保证在cout<<x<<endl;这里x会变成4,也就自增了3次。为什么会这样,因为cout<<其实也是去调用一个函数(操作符重载),调用函数的细节是编译器决定的。
如果你想了解的话,可以反编译这段代码来看看。
记住,不要在同一表达式里让一个变量自增或自减多次。

My life is brilliant
2012-10-09 13:58
liman123
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:79
专家分:178
注 册:2012-10-6
收藏
得分:0 
这个问题确实没有太大的讨论价值。自己怎么爽怎么用!
2012-10-09 14:34
wu_qingzhou
Rank: 1
等 级:新手上路
帖 子:43
专家分:2
注 册:2009-4-27
收藏
得分:0 
LZ,把你所用的编译器和电脑内核发出来看看,有可能哥就是类似7L说的原因导致的。
2012-10-09 16:13
wu_qingzhou
Rank: 1
等 级:新手上路
帖 子:43
专家分:2
注 册:2009-4-27
收藏
得分:0 
lz1091914999强大啊
2012-10-09 16:14
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:0 
回复 9楼 a99875984
你的代码行为,有好几处是“实现定义的”,也就是说C++标准没有规定其行为必须如何如何
也就是对于你这段代码,不同的编译器可能输出不同的结果。这样的陷阱式代码是最不能为人所容忍的,所以你不该写出这样的代码;也不用浪费时间去研究它,因为标准对其无定义,顶多你只能搞明白某个编译器为什么这么输出,但这和C++无关。

对于你给的代码,我先吐槽两个不相干的问题
a. C++中没有 iostream.h 这个头文件(历史上是有的,但早就被废弃了)
b. C++中不允许函数省略返回类型(历史上是可以的,但早就被禁止了)

言归正传
1。cout<<x++<<endl<<x++<<endl<<x++<<endl; 等同于 cout.operator<<(x++).operator<<(endl).operator<<(x++).operator<<(endl).operator<<(x++).operator<<(endl)
operator<< 可以看成一个成员函数名,去掉不相干的东西,可以看作
obj.menfun(x++).menfun(x++).menfun(x++)
注: 是否是“等同于”要看库的实现,但这不是重点。你可以参考一下这篇文章 http://blog.

2。对于 obj.menfun(x++).menfun(x++).menfun(x++)
是哪个x++先入栈?这是标准未规定的,如果是从右往左入栈的话,那就可能输出 3 2 1
注:只是“可能”,因为这还涉及的“顺序点”的问题

3。顺序点
我随便Google到一个“顺序点”的文章,你先看懂 http://developer.
注意其中第六条“6)在函数所有参数赋值之后但在函数第一条语句执行之前;”
对于 obj.menfun(x++).menfun(x++).menfun(x++)
是第一个menfun是执行,也就是说三个 x++ 在同一个顺序点之间,那么其行为又是“实现定义的”
2012-10-09 16:19
快速回复:这结果为何是这样啊,求解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017896 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved