2008-10-06 29 views
16

在C#中,沒有任何人知道爲什麼下面將編譯:前和後遞增/遞減運營商在C#

int i = 1; 
++i; 
i++; 

但這不會編譯?

int i = 1; 
++i++; 

(編譯錯誤:一個增量或減量運算符的操作數必須是一個變量,屬性或索引。)

+2

它是一個合法的問題,爲什麼要讓他失望? – Will 2008-10-06 13:18:15

回答

19

中,遞增/遞減的結果是一個值 - 你不能使用遞增/遞減的值,它必須是一個可以設置的變量。

-3

我的猜測:避免這樣的難看的和不必要的構建體。此外,它會使用2個操作(2x INC)而不是一個(1x ADD 2)。

是的,我知道......「但我想增加兩個,我是一個l33t g33k!」

好了,不要成爲一個怪胎,寫的東西,看起來並不像一個無心之失,是這樣的:你在其他的結果運行一個操作數

i += 2; 
+0

這有點苛刻你不覺得嗎?他只問它爲什麼不編譯 - 一個關於編譯器設計的問題,而不是關於代碼風格。 – fluffels 2008-10-06 17:51:15

3

我的猜測是++我返回一個整數值類型,然後嘗試應用++運算符。看到你無法寫入一個值類型(想想0 ++,如果這樣做有道理),編譯器會發出一個錯誤。

換句話說,這些語句被解析爲這個順序:

++i (i = 2, returns 2) 
2++ (nothing can happen here, because you can't write a value back into '2') 
9

出於同樣的原因,你不能說

5++; 

f(i)++; 

函數返回一個,而不是一個變量。增量運算符也返回值,但不能應用於值。