我有这样的代码:
std::cout << " a: " << classDate.getDays() << " b: " << classDate++ << " c: " << classDate.getDays();
我重载后增量运算符。
类m_days变量中的具有值:
我的问题是,为什么来自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)。
这是运营商的优先问题吗?
卡米尔
答案 0 :(得分:6)
在C ++中,函数参数的评估顺序(以及此处使用的重载operator<<
只是一个函数)是未定义的,因此编译器可以自由地评估classDate++
以及每个{{1}以它选择的任何顺序。因此,使用不同的编译器或不同的编译选项,您可以获得任何
classDate.getDays()
如果您希望按特定顺序对它们进行评估,则应将输出放在septate语句中,如第二个示例所示。
答案 1 :(得分:1)
评估的顺序未指定。
看看这个answer,这是对这种结果的一个很好的解释
答案 2 :(得分:1)
我的猜测,++运算符实际上会导致在序列点之后发生副作用(请参阅http://en.wikipedia.org/wiki/Sequence_point和Undefined behavior and sequence points)。
到达seuqence点时,它在表达式得到评估时依赖于编译器。 所以你不能依赖表达式的评估顺序。
在你的第二个例子中,分号后面有序列点,因此它按预期工作。