前缀操作符在c++和c#中的差异
Prefix operator difference in C++ and C#
让我们有这样一段代码:
int a = 1;
int b = ++a + ++a;
在c++ (VS 2010)中结果是:b = 6但在c#中结果是:b = 5
发生什么事了?为什么结果不同?
这是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, &
相关文章:
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数