我有以下用 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
. 这种差异的原因是什么?
不同之处在于预增量运算符在 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 因为您要修改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 编译器实际上确实允许这样做,并且会创建地狱般的调试场景)