2

可能重复:
cout << c++ << c; 的正确答案是什么?

我有以下代码 -

int a= 7;
const int &b = a;
int &c = a;

如果我使用

cout << endl << ++c << '\t' << a << '\t' << b << '\t' <<  c;

它打印

"8 7 7 8"

但是,如果我使用

cout << endl << a << '\t' << b << '\t' << ++c << '\t' << a << '\t' << b << '\t' <<  c;

它打印

"8 8 8 8 8 8"

这究竟是怎么发生的?它与优化有关吗?如果是,我如何在 ideone.com 中将其关闭???

4

2 回答 2

3

实际上 operator<< 是一个函数调用,c++ 允许以它喜欢的任何顺序评估传递给函数的参数,因此 ++c inc 是由你的编译器首先完成的,非常合法 - 我的做法不同。

有趣的是我的编译器打印

8       8       8       7       7

一些编译器为函数参数的评估顺序提供了开关,但如果你真的需要使用它,我会质疑自己的原因,因为代码有更多错误,而是以可移植的方式编写。

于 2012-10-02T02:48:57.130 回答
2

a, b, 和c都是同一个对象。然而,函数参数的求值顺序是未定义的。因此,无论编译器选择首先评估什么都可以。看来,在您的第二个表达式中,它++c首先评估。避免问题的方法是不要将修改与表达式的其余部分折叠起来,即c在输出之前或之后递增。

于 2012-10-02T02:51:08.183 回答