13
x = 1;
std::cout << ((++x)+(++x)+(++x));

我希望输出是11,但实际上是12。为什么?

4

5 回答 5

65

我们通过期待未定义的行为而不是任何特定的结果来解释它。由于表达式试图在没有中间序列点的情况下多次修改 x ,所以它的行为是 undefined

于 2009-10-06T12:07:24.650 回答
12

正如其他人所说,C 和 C++ 标准没有定义这将产生的行为。

但是对于那些不明白为什么标准会做这样的事情的人,让我们来看一个“现实世界”的例子:

1 * 2 + 3 + 4 * 5

1 * 2 + 3在我们计算之前计算没有错4*5。仅仅因为乘法比加法具有更高的优先级并不意味着我们需要在进行任何加法之前执行表达式中的所有乘法。事实上,有许多不同的订单可以有效地执行您的计算。

在评估有副作用的情况下,不同的评估顺序会影响结果。如果标准没有定义行为,请不要依赖它

于 2009-10-06T12:34:21.803 回答
4

这实际上是未定义的。C++ 没有明确定义语句的执行顺序,因此它取决于编译器,不应使用此语法。

于 2009-10-06T12:07:41.403 回答
3

代码片段将调用C/C++ 中的未定义行为。从此处阅读有关序列点的信息。

于 2009-11-22T01:20:36.043 回答
-1

在我看来

cout<<((++x)+(++x)+(++x));

编译器首先运行前缀 ++x 所以 x 的值变成

x=2


现在通过 ++x,x 将变为

x=3


++x 之后

x=4


现在是时候添加 x 的值了

x+x+x=4+4+4

x+x+x=12

于 2015-02-23T14:24:12.200 回答