++i运算符在C#和C++中的差异

本文关键字:C++ 运算符 ++i | 更新日期: 2023-09-27 18:26:23

我用C++和C#编写了以下代码

 int i=0;
 ++i = 11;

在这个C#编译器带来错误之后

The left-hand side of an assignment must be a variable, property or indexer

但C++编译器生成的代码没有任何错误,我得到了值为i的结果11。造成这种差异的原因是什么?

++i运算符在C#和C++中的差异

不同之处在于,预增量运算符在C++中是左值,而在C#中不是
在C++中,++i返回对递增变量的引用。在C#中,++i返回变量i的增量值。
因此,在这种情况下,++i在C++中是左值,在C#中是右值

从C++规范看前缀增量算子

操作数的类型应为算术类型或指向完全定义的对象类型。该值是操作数;它是一个左值

p.S.后缀增量运算符i++在C#和C++中都不是左值,因此这几行代码在这两种语言中都会带来错误。

 int i=0;
 i++ = 11;

注意,++i = 11调用C++03中的undefined,因为您在没有插入序列点的情况下修改了i两次。然而,它在C++11中有很好的定义:首先是增量,然后是赋值。

C#和C++是两种完全不同的语言和概念。它们之所以共享这个名称,是因为它们的语法是基于C的。所以实际上,"为什么这在C#上有效,而在C++上无效"这一问题毫无意义。这就好比为什么一张桌子在英语中被称为"table",而在西班牙语中被称"mesa"。因为它是这样决定的。

C#根本不允许这样的语法。

在C++中,您可以:首先计算++i,这就形成了i = 1,然后将11分配给i,这就构成了i = 11

语义非常不同。在c++中,语义是将值11分配给i标识的存储位置。在c#中,语义等于下面语句的语义

1=11

也就是说,这等于试图将值11分配给C#编译器不允许的值1。(Fortran编译器实际上允许这样做,也允许那样做,这可能会创建地狱般的调试场景)