14

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

 int i=0;
 ++i = 11;

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

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

但是 C++ 编译器生成此代码时没有错误,我得到的结果11i. 这种差异的原因是什么?

4

4 回答 4

42

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

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

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

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

 int i=0;
 i++ = 11;
于 2012-03-01T13:19:47.770 回答
6

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

于 2012-03-01T15:45:42.967 回答
5

C# 和 C++ 是两种完全不同的语言和概念。它们只共享名称,因为它们的语法基于 C。因此,实际上“为什么这适用于 C# 而不适用于 C++”作为一个问题毫无意义。这就像说为什么一张桌子在英语中称为“table”,但在西班牙语中称为“mesa”。因为它被决定是那样的。

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

在 C++ 中,您可以:首先++i是计算,这使得i = 1,然后 11 被分配给i,这使得i = 11.

于 2012-03-01T13:20:23.533 回答
2

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

1=11

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

于 2012-03-01T13:29:01.527 回答