Подтвердить что ты не робот

Что возвращает оператор ++ (или -)?

Во время игры с оператором ++ я попытался написать следующее:

++i++;

Я ожидал, что это скомпилировать сначала, но я получил ошибку компилятора:

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

Затем я попробовал написать ++(i++), чтобы помочь компилятору понять, что я имел в виду, но это также (неудивительно) не сработало.

Итак, мне осталось интересно, что возвращает оператор ++? С ошибкой компилятора, которую я получаю, я ожидал, что ++i не вернет значение int, представляющее значение i, добавленное, но это также не так, поскольку я могу сделать i = (++i) + 1 с успехом...

Кто-нибудь знает, почему оператор ++ не может быть привязан к цепи?

Кроме того, (++i).GetType() возвращает System.Int32.

4b9b3361

Ответ 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;