2012-03-01 70 views
14

我已经写在C++和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。这种差异的原因是什么?

+4

offtopic:为什么你想增加它,然后直接将它设置为11?增量没有意义。 – RvdK 2012-03-01 13:20:32

+0

这段代码有什么用? – 2012-03-01 13:21:23

+0

'someArray [++ i] = 11'会更有​​意义。 – 2012-03-01 13:21:50

回答

41

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

从C++约前缀递增运算符

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

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

int i=0; 
i++ = 11; 
5

C#和C++是2种完全不同的语言和概念。他们只是共享这个名字,因为他们的语法是基于C语言的。所以实际上“为什么这对C#有效,而不是C++”是没有意义的。这与说英文为什么一张桌子叫做“table”的原因相同,但是西班牙语的“mesa”是这样说的。因为它是这样决定的。

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

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

+3

这有点苛刻。问题*对于C语言来说是通用的,许多在C++中工作的东西也可以在C#中使用!这是一个完全有效的IMO问题,特别是在C++中,所涉及的代码代表了一种没有逻辑意义的声明。 – adelphus 2012-03-01 14:52:22

+0

苛刻?为什么苛刻?我只是声明C#和C++除了基于C之外没有什么共同之处。这个问题对C来说并不常见,因为他不是在问C,而在C语言中,这个语句完美工作,并且它不在C#中,它只是演示C#与C无关,除了名称和语法(其中btw由Perl,Java等许多语言复制)。 – m0skit0 2012-03-01 15:02:04

+2

C#和C++有相似之处......没有什么不同,例如Java和Haskell。所以对我来说这是一个有效的问题,对我来说这很有趣。 – 2012-03-01 19:39:01

2

的语义有很大的不同。在C++中,语义是将值11分配给由i标识的存储位置。在C#中的语义是等于下面的语句

1=11 

也就是说它等于试图将值11分配给值1,其中C#编译器不允许的语义。 (Fortran编译器实际上确实允许这样做,并且可以创建死循环的调试场景)

6

请注意,++i = 11在C++ 03中调用未定义,因为您正在修改i而没有插入序列点。但是,在C++ 11中定义明确:首先是增量,然后是赋值。