我们有这段代码:
int a = 1;
int b = ++a + ++a;
在C ++(VS 2010)中,结果是:b = 6 但在C#中,结果是:b = 5
那里发生了什么?为什么结果不同?
答案 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#。