让我们有这段代码:
int a = 1;
int b = ++a + ++a;
在 C++(VS 2010)中,结果为:b = 6,但在 C# 中,结果为:b = 5
那里发生了什么事?为什么结果不一样?
让我们有这段代码:
int a = 1;
int b = ++a + ++a;
在 C++(VS 2010)中,结果为:b = 6,但在 C# 中,结果为:b = 5
那里发生了什么事?为什么结果不一样?
它undefined behaviour
在 C++ 中。sequence points
您试图在没有(根据 C++98/03 标准)的情况下多次修改值。
关于 C++11
运算符的操作数的值计算在运算符结果的值计算之前排序。如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义。
例子:
i = v[i++]; // the behavior is undefined i = i++ + 1; // the behavior is undefined
在 C++ 中,int b = ++a + ++a
是未定义的行为,因此您可以期待任何结果。
C# 和 C++ 是不同的语言,具有不同的语义。
C# 决定首先执行第一个 ++a,然后执行另一个 ++a,最后将这两个表达式相加,因此结果为 5。
在 C++ 中,您有未定义的行为。结果可以是 2、3、4、5、6、34500 或任何其他值。另一个可能的结果是马修·沃森喝光了冰箱里的所有啤酒。事实上,任何事情都有可能发生。
一般来说,期望两种不同语言的相同行为是没有意义的。每个人都遵循自己的规则。
注意:请参阅此问题Pre & post increment operator behavior in C、C++、Java 和 C#以进行进一步的跨语言讨论。