我已经写了下面这段代码,既有C++版本也有C#版本
int i=0;
++i = 11;
在这之后,C#编译器会报错
The left-hand side of an assignment must be a variable, property or indexer
但是C++编译器生成了这段代码,没有出现错误,并且我得到了一个结果11
,作为i
的值。这种差异的原因是什么?
我已经写了下面这段代码,既有C++版本也有C#版本
int i=0;
++i = 11;
在这之后,C#编译器会报错
The left-hand side of an assignment must be a variable, property or indexer
但是C++编译器生成了这段代码,没有出现错误,并且我得到了一个结果11
,作为i
的值。这种差异的原因是什么?
++i
返回对已增加的变量的引用。而在C#中,++i
返回变量i已增加的值。因此,在这种情况下,++i
在C++中是左值,在C#中是右值。 int i=0;
i++ = 11;
++i = 11
会导致未定义行为,因为您在没有中间序列点的情况下两次修改了i
。然而,在C++11中,它是明确定义的:首先进行递增,然后进行赋值。++i
,这使得 i = 1
,然后将 11 赋值给 i
,这使得 i = 11
。语义差异很大。在C++中,语义是将值11分配给由i标识的存储位置。在C#中,语义等同于以下语句的语义。
1=11
这就相当于试图将值11赋给值1,而C#编译器不允许这样做。(Fortran编译器实际上允许这样做,这可能会导致非常困难的调试场景)
someArray[++i] = 11
更有意义。 - Joseph Le Brech