我已經寫在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
。這種差異的原因是什麼?
我已經寫在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
。這種差異的原因是什麼?
區別在於,預增加運算符是C++中的左值,並且不在C#中。
在C++ ++i
中返回對增量變量的引用。在C#++i
中返回變量i的遞增值。
所以在這種情況下++i
是左值在C++和右值在C#中。
從C++約前綴遞增運算符
類型的操作數應該是一個算術類型或一個指針指向一個 完全定義的對象類型規範。該值是操作數 的新值;它是一個左值。
P.S.後綴增量運算符i ++在C#和C++中都不是左值,所以這行代碼會在兩種語言中都帶來錯誤。
int i=0;
i++ = 11;
C#和C++是2種完全不同的語言和概念。他們只是共享這個名字,因爲他們的語法是基於C語言的。所以實際上「爲什麼這對C#有效,而不是C++」是沒有意義的。這與說英文爲什麼一張桌子叫做「table」的原因相同,但是西班牙語的「mesa」是這樣說的。因爲它是這樣決定的。
C#根本不允許這樣的語法。
在C++中,您可以:首先計算++i
,這使得i = 1
,然後11被分配給i
,這使得i = 11
。
這有點苛刻。問題*對於C語言來說是通用的,許多在C++中工作的東西也可以在C#中使用!這是一個完全有效的IMO問題,特別是在C++中,所涉及的代碼代表了一種沒有邏輯意義的聲明。 – adelphus 2012-03-01 14:52:22
苛刻?爲什麼苛刻?我只是聲明C#和C++除了基於C之外沒有什麼共同之處。這個問題對C來說並不常見,因爲他不是在問C,而在C語言中,這個語句完美工作,並且它不在C#中,它只是演示C#與C無關,除了名稱和語法(其中btw由Perl,Java等許多語言複製)。 – m0skit0 2012-03-01 15:02:04
C#和C++有相似之處......沒有什麼不同,例如Java和Haskell。所以對我來說這是一個有效的問題,對我來說這很有趣。 – 2012-03-01 19:39:01
的語義有很大的不同。在C++中,語義是將值11分配給由i標識的存儲位置。在C#中的語義是等於下面的語句
1=11
也就是說它等於試圖將值11分配給值1,其中C#編譯器不允許的語義。 (Fortran編譯器實際上確實允許這樣做,並且可以創建死循環的調試場景)
請注意,++i = 11
在C++ 03中調用未定義,因爲您正在修改i
而沒有插入序列點。但是,在C++ 11中定義明確:首先是增量,然後是賦值。
offtopic:爲什麼你想增加它,然後直接將它設置爲11?增量沒有意義。 – RvdK 2012-03-01 13:20:32
這段代碼有什麼用? – 2012-03-01 13:21:23
'someArray [++ i] = 11'會更有意義。 – 2012-03-01 13:21:50