++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
。造成这种差异的原因是什么?
不同之处在于,预增量运算符在C++中是左值,而在C#中不是 从C++规范看前缀增量算子 操作数的类型应为算术类型或指向完全定义的对象类型。该值是操作数;它是一个左值。 p.S.后缀增量运算符i++在C#和C++中都不是左值,因此这几行代码在这两种语言中都会带来错误。
在C++中,++i
返回对递增变量的引用。在C#中,++i
返回变量i的增量值。
因此,在这种情况下,++i
在C++中是左值,在C#中是右值 int i=0;
i++ = 11;
注意,++i = 11
调用C++03中的undefined,因为您在没有插入序列点的情况下修改了i
两次。然而,它在C++11中有很好的定义:首先是增量,然后是赋值。
C#根本不允许这样的语法。
在C++中,您可以:首先计算++i
,这就形成了i = 1
,然后将11分配给i
,这就构成了i = 11
。
语义非常不同。在c++中,语义是将值11分配给i标识的存储位置。在c#中,语义等于下面语句的语义
1=11
也就是说,这等于试图将值11分配给C#编译器不允许的值1。(Fortran编译器实际上允许这样做,也允许那样做,这可能会创建地狱般的调试场景)