【问题标题】:Prefix operator difference in C++ and C# [duplicate]C++和C#中前缀运算符的区别[重复]
【发布时间】:2013-06-14 10:56:37
【问题描述】:

让我们来看看这段代码:

int a = 1;
int b = ++a + ++a;

在 C++ (VS 2010) 中,结果是:b = 6 但在 C# 中,结果是:b = 5

那里发生了什么?为什么结果不一样?

【问题讨论】:

  • 是否有任何 C# 专家可以说出 b = 5 是否是标准的?你可以看到它是合理的:中心 + 是可交换的;一个 ++a 是 2,另一个是 3,而您正在对它们求和。
  • @Bathsheba 一些有趣的跨语言讨论:stackoverflow.com/questions/6457130/…
  • @Daniel Daranas;很好的链接;我认为这个问题现在已经解决了。
  • 更详细的 C# 讨论,请参阅stackoverflow.com/q/8573190/96780

标签: c# c++ pre-increment


【解决方案1】:

C# 和 C++ 是不同的语言,具有不同的语义。

C# 决定先执行第一个 ++a,然后执行另一个 ++a,最后将这两个表达式相加,因此结果为 5。

在 C++ 中,您有未定义的行为。结果可以是 2、3、4、5、6、34500 或任何其他值。另一个可能的结果是Matthew Watson drinking all the beer in his fridge。实际上,任何事情都有可能发生。

一般来说,期望两种不同语言的相同行为是没有意义的。每个人都遵循自己的规则。


注意:请参阅此问题Pre & post increment operator behavior in C, C++, Java, & C# 以进行进一步的跨语言讨论。

【讨论】:

  • 老兄,C# 结果是 5,而不是 6。
  • @Bathsheba 谢谢。我编辑了我的答案。
  • 和 +1 用于将 C# 带入答案。但是 C# 版本是否保证适用于所有未来的 C# 版本?
  • @Bathsheba 我懒得查了,但我猜这两个 ++a 之间的评估顺序是明确定义的。最后一件事:无论如何,我鄙视这种编码风格。
  • 我发现前缀/后缀运算符非常低级,以至于我自然希望它们的行为在所有语言中都是相同的。但显然情况并非如此。
【解决方案2】:

在 C++ 中是 undefined behaviour。您试图在没有 sequence points 的情况下多次修改值(根据 C++98/03 标准)。

关于 C++11

一个操作数的值计算 运算符在运算符结果的值计算之前排序。如果对标量产生副作用 相对于同一标量对象的另一个副作用或值计算,对象是无序的 使用相同标量对象的值,行为未定义。

例子:

i = v[i++]; // the behavior is undefined
i = i++ + 1; // the behavior is undefined

【讨论】:

    【解决方案3】:

    在 C++ 中,int b = ++a + ++a 是未定义的行为,因此您可以期待任何结果。

    【讨论】:

    • 我上次试的时候,它把我冰箱里的啤酒都喝光了!
    • @MatthewWatson 为了完整起见,我在答案中添加了可能的结果。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2015-07-29
    • 2022-11-24
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多