В C # в чем разница между myInt ++ и ++ myInt? - PullRequest
7 голосов
/ 13 января 2009

Мне трудно понять, в чем разница между приращением переменной в C # таким образом:

myInt++;

и

++myInt;

Когда будет иметь значение, какой из них вы используете?

За лучший ответ я предоставлю voiceCount ++. Или я должен дать это ++ voiceCount ...

Ответы [ 11 ]

52 голосов
/ 13 января 2009

Нет разницы при написании самостоятельно (как показано) - в обоих случаях myInt будет увеличен на 1.

Но есть разница, когда вы используете его в выражении, например как то так:

MyFunction(++myInt);
MyFunction(myInt++);

В первом случае myInt увеличивается, а новое / увеличенное значение передается MyFunction (). Во втором случае старое значение myInt передается MyFunction () (но myInt по-прежнему увеличивается до вызова функции).

Другой пример:

int myInt = 1;
int a = ++myInt;
// myInt is incremented by one and then assigned to a.
// Both myInt and a are now 2.
int b = myInt++;
// myInt is assigned to b and then incremented by one.
// b is now 2, myInt is now 3

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

++i; // pre-increment
i++; // post-increment
--i; // pre-decrement
i--; // post-decrement

Как Джон Скит указывает:

Другие показали, где это делает разница, и прокомментировали, что как одно заявление, которое он не делает разница.

Я бы хотел добавить, что это почти всегда плохая идея использовать его там, где это имеет значение. Я подозреваю там может быть несколько раз, когда это больше читаемый, чтобы иметь такой код, как:

Console.WriteLine("Foo: {0}", foo++);

чем:

Console.WriteLine("Foo: {0}", foo);
foo++; 

... но они очень редкие! последний из этих двух образцов делает заказ кристально чистый сразу - первое требует немного обдумать (в любом случае, к моему бедному мозгу). Думать о удобочитаемость в первую очередь.

11 голосов
/ 13 января 2009

Другие показали, где это имеет значение, и прокомментировали, что как одно утверждение это не имеет значения.

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

Console.WriteLine("Foo: {0}", foo++);

чем:

Console.WriteLine("Foo: {0}", foo);
foo++;

... но они очень редкие! Последний из этих двух образцов сразу делает кристальный порядок ясным - первый требует немного обдумывания (во всяком случае, моему плохому мозгу). Сначала подумайте о читабельности.

9 голосов
/ 13 января 2009

Нет, если только не в выражении, т.е.

myInt=1;
x=myInt++;

отличается от:

myInt=1;
x=++myInt;

Первый присваивает 1 х, потому что присваивание происходит до приращения.

Секунда присваивает 2 x, потому что присваивание происходит после приращения.

6 голосов
/ 13 января 2009

В присваивании или выражениях, например

x = ++myInt; // x = myInt + 1
x = myInt++; // x = myInt

Это также может быть использовано в выражениях, таких как циклы или операторы if. Например, возьмем следующее, где search равен 0, а count равен 3.

while(seek++ < count) {
   Console.WriteLine(seek);
}

приводит к выводам 1, 2 и 3 для поиска, а следующее

while(++seek < count) {
   Console.WriteLine(seek);
}

Результаты 1 и 2 для поиска. Поэтому ++ myInt увеличивает myInt до того, как будет оценено его значение, тогда как myInt ++ увеличивается после его вычисления.

4 голосов
/ 13 января 2009

myInt ++ (4 инструкции процессора)

LOAD AX, #myInt // From myInt memory to a CPU register
COPY AX, BX
INCREMENT BX
STORE BX, #myInt
// Use AX register for the value

++ myInt (3 инструкции процессора)

LOAD AX, #myInt // From myInt memory to a CPU register
INCREMENT AX
STORE AX, #myInt
// Use AX register for the value
3 голосов
/ 13 января 2009

Я думаю, это проще всего понять с точки зрения порядка оценки и модификации .

  • Оператор постфикса (x ++) оценивает первым и изменяет последним.
  • Префиксный оператор (++ x) изменяет первый и оценивает последний.

(порядок операций очевиден в типизированном порядке оператора и переменной)

т.е. при использовании в выражении оператор postfix оценивает и использует текущее значение переменной в выражении (оператор возврата или вызов метода) перед применением оператора. С префиксным оператором все наоборот.

3 голосов
/ 13 января 2009

Оператор предварительной фиксации ++ myInt - это способ сокращения строк: увеличивайте переменную перед тем, как передать ее в другое место. Это также хороший способ уменьшить читабельность, так как это необычно.

MyMethod(++myInt); 

против.

myInt++; 
MyMethod(myInt);

Мне второе легче читать.

3 голосов
/ 13 января 2009

Определяет, когда будет возвращен результат для этой операции.

Вот пример с сайта MSDN :

static void Main() 
{
    double x;
    x = 1.5;
    Console.WriteLine(++x);
    x = 1.5;
    Console.WriteLine(x++);
    Console.WriteLine(x);
}

И выход:

2.5
1.5
2.5
3 голосов
/ 13 января 2009

Это разница, если вы делаете

int x = 7;
int x2 = x++;

=> x2 is 7 and x is 8

но при выполнении

int x = 7;
int x2 = ++x;

=> x2 is 8 and x is 8
2 голосов
/ 13 января 2009

++ myInt добавит один к myInt перед выполнением рассматриваемой строки, myInt ++ сделает это позже.

Примеры:

int myInt;

myInt = 1;
someFunction(++myInt); // Sends 2 as the parameter

myInt = 1;
someFunction(myInt++); // Sends 1 as the parameter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...