Однострочный инкремент и оператор возврата в C # - PullRequest
4 голосов
/ 04 марта 2011

Проигрывая с C # последние несколько дней и пытаясь воспользоваться его "лаконичным" синтаксисом, я попытался использовать следующий прием.

Int32 _LastIndex = -1; 
T[] _Array;
_Array[_LastIndex++] = obj;

Теперь проблема в том, что он возвращает значение до увеличения числа, поэтому я попытался ...

_Array[(_LastIndex++)] = obj;

И все же происходит то же самое поведение (что также меня немного смутило).

Может ли кто-нибудь сначала объяснить, почему второй пример (я понимаю, почему первый) не работает? И есть ли способ выполнить то, что я пытаюсь сделать?

Ответы [ 3 ]

5 голосов
/ 04 марта 2011

Окружение постинкремента _LastIndex++ круглыми скобками не разделяет его на отдельную операцию, оно просто изменяется:

_Array[_LastIndex++] = obj;    // _Array[_LastIndex] = obj; _LastIndex++;

на:

_Array[(_LastIndex++)] = obj;  // _Array[(_LastIndex)] = obj; _LastIndex++;

Если вы хотитедля увеличения перед использованием вам необходим вариант предварительного увеличения, как показано ниже:

_Array[++_LastIndex] = obj;    // ++_LastIndex; _Array[_LastIndex] = obj;
4 голосов
/ 04 марта 2011

Вы пробовали _Array[++_LastIndex].

LastIndex++ увеличивает значение, но возвращает старое значение.

++LastIndex увеличивает и возвращает увеличенное значение.

2 голосов
/ 04 марта 2011

Требуется:

_Array[++_LastIndex] = obj;

Это называется предварительным приращением, что означает, что приращение происходит до использования значения.Круглые скобки используются для изменения приоритета, а не для изменения порядка оценки.Кроме того, скобки не влияли на приоритет в этом случае.

...