我们如何解释表达式 (++x)+(++x)+(++x) 的结果?

发布于 2024-08-06 14:27:30 字数 129 浏览 5 评论 0原文

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

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

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

I expect the output to be 11, but it's actually 12. Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

小镇女孩 2024-08-13 14:27:30

我们通过期待未定义的行为来解释它,而不是任何特定的结果。由于表达式尝试多次修改 x 而没有插入 序列点,其 行为未定义

We explain it by expecting undefined behaviour rather than any particular result. As the expression attempts to modify x multiple times without an intervening sequence point its behaviour is undefined.

素手挽清风 2024-08-13 14:27:30

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

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

1 * 2 + 3 + 4 * 5

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

当评估有副作用时,不同的评估顺序可能会影响结果。如果标准没有定义行为,不要依赖它

As others have said, the C and C++ standards do not define the behaviour that this will produce.

But for those people who don't see why the standards would do such a thing, let's go through a "real world" example:

1 * 2 + 3 + 4 * 5

There's nothing wrong with calculating 1 * 2 + 3 before we calculate 4*5. Just because multiplication has a higher precedence than addition doesn't mean we need to perform all multiplication in the expression before doing any addition. In fact there are many different orders you validly could perform your calculations.

Where evaluations have side effects, different evaluation orders can affect the result. If the standard does not define the behaviour, do not rely on it.

清浅ˋ旧时光 2024-08-13 14:27:30

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

This is actually undefined. C++ doesn't define explicitly the order of execution of a statement so it depends on the compiler and this syntax shouldn't be used.

漆黑的白昼 2024-08-13 14:27:30

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

The code snippet will invoke Undefined behavior in both C/C++.Read about Sequence Point from here.

无人问我粥可暖 2024-08-13 14:27:30

在我看来,

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

编译器首先运行前缀 ++x,所以 x 的值现在由 ++x 变为

x=2


之后将变为

x=3


,x在 ++x

x=4


现在是时候添加 x

x+x+x 的值了=4+4+4x

+x+x=12

In my opinion

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

compiler first run prefix ++x so value of x becomes

x=2


now by ++x, x will become

x=3


after ++x

x=4


Now its time to add values of x

x+x+x=4+4+4

x+x+x=12

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文