2012-03-01 66 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中定義明確:首先是增量,然後是賦值。