C ++和C#中的前缀运算符差异

时间:2013-06-18 09:29:27

标签: c# c++ pre-increment

我们有这段代码:

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

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

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

3 个答案:

答案 0 :(得分:10)

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

关于C ++ 11

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

示例:

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

答案 1 :(得分:7)

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

答案 2 :(得分:3)

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#