В С# в чем разница между myInt ++ и ++ myInt?

Мне сложно понять, какая разница между приращением переменной на С# следующим образом:

myInt++;

и

++myInt;

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

Я дам voteCount ++ для лучшего ответа. Или я должен дать ему ++ voteCount...

Ответы

Ответ 1

Нет никакой разницы при написании самостоятельно (как показано) - в обоих случаях 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

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

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

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

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

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

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

чем:

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

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

Ответ 2

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

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

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

чем:

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

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

Ответ 3

Это не так, если оно не находится в выражении, т.е.

myInt=1;
x=myInt++;

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

myInt=1;
x=++myInt;

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Вот пример из сайта 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

Ответ 8

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

MyMethod(++myInt); 

против.

myInt++; 
MyMethod(myInt);

Для меня второй намного легче читать.

Ответ 9

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

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

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

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

Ответ 10

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

Примеры:

int myInt;

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

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

Ответ 11

Если, например, вы делаете что-то вроде этого:

int myInt = 5;

Foo(++myInt);

void Foo(int x)
{
   Console.WriteLine(x);
}

Откроется 6.

Foo(myInt++);

распечатает 5;

В принципе, ++ myInt increments FIRST использует переменную SECOND. myInt ++ - это обратное.