Операторы Pre и post increment/decment в С#

В С# кто-нибудь знает, почему следующее компилируется:

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

но это не скомпилируется?

int i = 1;
++i++;

(Ошибка компилятора: операнд оператора инкремента или декремента должен быть переменной, свойством или индексом.)

Ответы

Ответ 1

вы запускаете один из операндов результата другого, результат приращения/уменьшения - это значение - и вы не можете использовать increment/decment для значения, которое оно должно быть переменной, которая может быть установлена.

Ответ 2

По той же причине вы не можете сказать

5++;

или

f(i)++;

Функция возвращает значение, а не переменную. Операторы приращения также возвращают значения, но не могут применяться к значениям.

Ответ 3

Мое предположение было бы, что ++ я возвращает целочисленный тип значения, к которому вы затем пытаетесь применить оператор ++. Если вы не можете написать тип значения (подумайте о 0 ++, и если это будет иметь смысл), компилятор выдаст ошибку.

Другими словами, эти утверждения анализируются как эта последовательность:

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

Ответ 4

Мое предположение: избегать таких уродливых и ненужных конструкций. Также он будет использовать 2 операции (2x INC) вместо одного (1x ADD 2).

Да, я знаю... ", но я хочу увеличить на два, и я l33t g33k!"

Ну, не будь выродком и напишите что-то, что не похоже на непреднамеренную ошибку, например:

i += 2;