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

我有以下用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 。 这种差异的原因是什么?

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

从关于前缀增量运算符的C ++规范

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

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

  int i=0; i++ = 11; 

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

C#和C ++是两种完全不同的语言和概念。 他们只共享名称,因为他们的语法是基于C.所以实际上“为什么这适用于C#但不适用于C ++”没有任何意义作为一个问题。 这就像说为什么一张表用英语称为“表”,而用西class牙语称为“mesa”。 因为决定那样。

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

在C ++中,你被允许:首先计算++i ,使得i = 1 ,然后将11分配给i ,这使得i = 11

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

 1=11 

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