注册 登录
编程论坛 C++教室

这结果为何是这样啊,求解释

a99875984 发布于 2012-10-08 21:35, 686 次点击
程序代码:
#include <iostream.h>
main()
{
    int x(0);
    x++;
    cout<<x++<<endl<<x++<<endl<<x++<<endl;
    cout<<x<<endl;
}

为何结果是
3
2
1
4
15 回复
#2
fxbszj2012-10-08 21:51
这位大哥,虽然我是C++初学者,也知道结果是:1(换行)2(换行)3(换行)4(换行),你说说那个结果,我就疑惑的试了下,结果在我意料之中,不知道你是不是在挑逗大伙呢
#3
a998759842012-10-08 21:56
回复 2楼 fxbszj
你看下我的那个结果好不?3 2 1 4,不是1 2 3 4
#4
fxbszj2012-10-08 21:59
回复 3楼 a99875984
我验证的结果是 1 2 3 4,不知道为什么你会出现那样的问题
#5
rjsp2012-10-09 08:37
别纠结于这些错误原因了,因为写出这样的代码,一定会被开除
#6
fxbszj2012-10-09 08:57
回复 5楼 rjsp
没有谁是生下来就什么都会的,楼主只是学习的途中有个问题搞不懂,你又何必在这里泼冷水,这样只会让人家看不起你
#7
liman1232012-10-09 10:46
这个可能是编译器在计算的时候是从左往右计算的,输出的时候是从右往左输出的(可能有点扯!)但估计也只有这可能了。
#8
qunxingw2012-10-09 11:29
没有问题就是最大的问题。
#9
a998759842012-10-09 13:05
回复 5楼 rjsp
我一个资料上看到的,不是我编的,我可没这么无聊哈
#10
a998759842012-10-09 13:08
回复 6楼 fxbszj
呵呵,版主没泼冷水,其实这些问题老师也不想解释,看起来太烦了。以后做项目时也不会碰到这样的,只是我的好奇心加上SB的中国教育就出现了这个帖子哈
#11
a998759842012-10-09 13:10
回复 8楼 qunxingw
说的太多了哈,不尽让我想起没上大学前
老师问:同学们都懂了吗?
学生:都懂了。
其实有多少都懂?
哎,我该庆幸有好奇心去问现在这问题
#12
lz10919149992012-10-09 13:58
在同一表达式里,如果有多次对一个变量的自增或自减操作,编译器不保证它的执行顺序,在GCC里的输出和LZ的输出一样,但在VC9.0里这段代码的输出是
1
1
1
4
也就是说,编译器只保证在cout<<x<<endl;这里x会变成4,也就自增了3次。为什么会这样,因为cout<<其实也是去调用一个函数(操作符重载),调用函数的细节是编译器决定的。
如果你想了解的话,可以反编译这段代码来看看。
记住,不要在同一表达式里让一个变量自增或自减多次。
#13
liman1232012-10-09 14:34
这个问题确实没有太大的讨论价值。自己怎么爽怎么用!
#14
wu_qingzhou2012-10-09 16:13
LZ,把你所用的编译器和电脑内核发出来看看,有可能哥就是类似7L说的原因导致的。
#15
wu_qingzhou2012-10-09 16:14
lz1091914999强大啊
#16
rjsp2012-10-09 16:19
回复 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++ 在同一个顺序点之间,那么其行为又是“实现定义的”
1