前缀操作符在c++和c#中的差异

本文关键字:操作符 c++ 前缀 | 更新日期: 2023-09-27 18:18:47

让我们有这样一段代码:

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

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

发生什么事了?为什么结果不同?

前缀操作符在c++和c#中的差异

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

关于c++ 11

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

例子:

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 &C, c++, Java, &