Что возвращает оператор ++ (или -)?
Во время игры с оператором ++
я попытался написать следующее:
++i++;
Я ожидал, что это скомпилировать сначала, но я получил ошибку компилятора:
Операнд оператора приращения или декремента должен быть переменной, свойства или индексатора.
Затем я попробовал написать ++(i++)
, чтобы помочь компилятору понять, что я имел в виду, но это также (неудивительно) не сработало.
Итак, мне осталось интересно, что возвращает оператор ++
? С ошибкой компилятора, которую я получаю, я ожидал, что ++i
не вернет значение int
, представляющее значение i
, добавленное, но это также не так, поскольку я могу сделать i = (++i) + 1
с успехом...
Кто-нибудь знает, почему оператор ++
не может быть привязан к цепи?
Кроме того, (++i).GetType()
возвращает System.Int32
.
Ответы
Ответ 1
В С# Оператор ++
возвращает значение до (для i++
) или после (для ++i
) приращения.
Ошибка, которую вы видите, заключается в том, что этот оператор может использоваться ТОЛЬКО для переменной , свойства или индексатора. Причина в том, что целью оператора является увеличение переменной, на которую ссылаются. Вы не можете использовать его для выражения или другого типа. Что бы сделать (9++)
?
Вы ожидаете, что (i++)++
будет эквивалентен i++; i++
. Но i++
возвращает значение и внутренне увеличивает i
. Поскольку вы не можете применить оператор ++ к цепочке значений, невозможно.
Разница в С++ заключается в том, что оператор префикса ++ принимает ссылку в качестве ввода и возвращает ссылку на исходное значение, поэтому вы можете связать оператор, поскольку он просто использует указатель вместо значения. Постфиксный оператор возвращает значение и, следовательно, не может быть привязан.
Ответ 2
Результатом оператора ++
или --
является значение переменной, свойства или индексатора, а не самой переменной, свойства или индексатора.
Вы не можете удваивать приращение переменной типа (i++)++
по той же причине, что вы не можете увеличить значение самостоятельно, как 100++
.
Ответ 3
Если я могу взять терминологию из C или С++, оператор ++ здесь возвращает "r-значение". Значение r не сопоставляется с типом языка, это синтаксический трюк, чтобы отличить то, что присваивается (модифицируется), а что нет.
Что-то, что вы можете найти в левой части операции присваивания, называется l-значением (левое значение), и вещи, которые вы можете найти в правой части задания, это "r-values" (правые значения), Оператор ++ должен работать с l-значением, потому что ему нужно назначить ему. Однако возвращаемое выражение должно быть r-значением, потому что было бы бессмысленно делать i++ = 4
в С#, так же, как это не имеет смысла делать foo.Bar() = 4
или 1 = 5
.
С# не имеет lvalues или rvalues per se, но ограничивает то, что можно найти в левой части назначения для переменных, свойств и операций индексатора. Это не случайно, что вы можете использовать оператор ++.
Ответ 4
Я понял, что вы не можете использовать ++
до или после выражения.
При использовании:
++(i++);
вы делаете что-то вроде:
++(<expression>)
Компилятор сначала разрешит выражение, а затем увеличит результат выражения, и это сойдет с ума. Операнд ++
работает, увеличивая непосредственную переменную без результата выражения.
Как оцениваются выражения программирования? Грамматика языка (BNF) http://people.cis.ksu.edu/~schmidt/301s11/Lectures/bnfT.html
Вот еще один пример правильного использования этого операнда ++
int i = 0, j = 0;
int sum = i++ + j++;
//result sum = 0, i = 1, j = 1
Этот операнд ++
бесполезен, так как делает 3 вещи сразу (чтение, приращение, назначение). Я лично не использую в больших выражениях, например, пример выше: i++ + j++
. Но я все еще использую его в цикле for-loop или while.
Даже короткое выражение, такое как i = j++;
, является беспорядком. Держите ваш код простым и понятным. Это же выражение можно записать так:
i = j;
j++; //or j+=1;