2008-10-06 11 views
16

W języku C#, czy ktoś wie dlaczego następujący skompiluje:przed i po operatorzy góra/dół w C#

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

ale nie będzie to skompilować?

int i = 1; 
++i++; 

(kompilator błąd: operand operatora zwiększać lub zmniejszać musi być zmienna, własności lub indeksującego).

+2

Jego uzasadnione pytanie, dlaczego go za to? – Will

Odpowiedz

19

jest uruchomiony jeden z argumentów na skutek drugiej, wynik inkrementacji/dekrementacji jest wartością - i nie można użyć inkrementacji/dekrementacji na wartości, która ma być zmienną, którą można ustawić.

-3

Domyślam: w celu uniknięcia takich brzydkie oraz niepotrzebnego konstrukcji. Również użyłby 2 operacji (2x INC) zamiast jednego (1x ADD 2).

Tak, wiem ... "ale chcę zwiększyć o dwa i jestem g33k l33t!"

Cóż, nie jest maniakiem i napisać coś, co nie wygląda jak nieumyślnego błędu, na przykład:

i += 2; 
+0

To trochę trudne, nie sądzisz? Pytał tylko, dlaczego się nie kompiluje - pytanie o konstrukcję kompilatora, a nie o styl kodu. – fluffels

+0

To jest trudne. Stwierdziłem, że pytanie jest trafne i użyteczne. –

3

Domyślam się, że ++ i zwraca typ wartości całkowitej, do którego następnie spróbujesz zastosować operatora ++. Widząc, że nie możesz pisać do typu wartości (pomyśl o 0 ++ i jeśli to ma sens), kompilator wyda błąd.

Innymi słowy, oświadczenia te są przetwarzane w następującej kolejności:

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

Z tego samego powodu nie można powiedzieć

5++; 

lub

f(i)++; 

funkcja zwraca wartość wartość, a nie zmienna. Operatory inkrementacji również zwracają wartości, ale nie można ich zastosować do wartości.