C ++ std :: cout和<<操作员,优先

时间:2013-12-09 20:29:34

标签: c++ operator-keyword cout

我有这样的代码:

std::cout << " a: " << classDate.getDays() << " b: " << classDate++ << " c: " << classDate.getDays();

我重载后增量运算符。

类m_days变量中的

具有值:

  • 之前的++ operator - 4
  • 在++ oprator -5
  • 之后

我的问题是,为什么来自cout的结果的顺序错误:

a:5 b:5 c:4

我在debuger中检查过,类中的值是正确的。当我写这样的代码时:

std::cout << " a: " << classDate.getDays();
std::cout << " b: " << classDate++;
std::cout << " c: " << classDate.getDays();

一切都是正确的(a:4 b:5 c:5)。

这是运营商的优先问题吗?

卡米尔

3 个答案:

答案 0 :(得分:6)

在C ++中,函数参数的评估顺序(以及此处使用的重载operator<<只是一个函数)是未定义的,因此编译器可以自由地评估classDate++以及每个{{1}以它选择的任何顺序。因此,使用不同的编译器或不同的编译选项,您可以获得任何

classDate.getDays()

如果您希望按特定顺序对它们进行评估,则应将输出放在septate语句中,如第二个示例所示。

答案 1 :(得分:1)

评估的顺序未指定。

看看这个answer,这是对这种结果的一个很好的解释

答案 2 :(得分:1)

我的猜测,++运算符实际上会导致在序列点之后发生副作用(请参阅http://en.wikipedia.org/wiki/Sequence_pointUndefined behavior and sequence points)。

到达seuqence点时,它在表达式得到评估时依赖于编译器。 所以你不能依赖表达式的评估顺序。

在你的第二个例子中,分号后面有序列点,因此它按预期工作。