Увеличение и уменьшение i не работает должным образом

Следующие две строки кода не возвращают одно и то же значение. Любая причина для этого?

int i;

i = 1;
i = i + i++; //Returns 2, expecting 3

И

i = 1;
i = i++ + i; //Returns 3

Семантически это должно быть одно и то же a + b = b + a, верно?

То же самое с уменьшением i:

i = 1;
i = i - i--; //Returns 0, expecting 1

И

i = 1;
i = i-- - i; //Returns 1, expecting -1

Что меня еще больше смущает, так это использование операторов постинкремента:

i = 1;
i = i + ++i; //Returns 3

И

i = 1;
i = ++i + i; //Returns 4, expecting 3

То же самое снова с уменьшающим оператором:

i = 1;
i = i - --i; //Returns 1

И

i = 1;
i = --i - i; //Returns 0, expecting -1

Последний вопрос:

Как эти две строки интерпретируются компилятором?

i = i+++i; // is it i + ++i or i++ + i?
i = i---i; // is it i - --i or i-- - i?

person Moslem Ben Dhaou    schedule 07.10.2013    source источник
comment
Почти дубликат stackoverflow.com/q/13516689/11683 и stackoverflow.com/a/3346729/11683 (последний от Эрика Липперта, обязательно прочтите).   -  person GSerg    schedule 07.10.2013
comment
i = 1; i = i + i++ Почему вы ожидаете 3 здесь?   -  person Sriram Sakthivel    schedule 07.10.2013
comment
Это просто показывает, что вы никогда не должны использовать ++ и/или -- с переменной, которая также используется в другом месте в том же выражении. Это слишком сложно читать.   -  person Matthew Watson    schedule 07.10.2013
comment
возможный дубликат C# путаницы до и после увеличения   -  person nawfal    schedule 20.07.2014


Ответы (4)


i = i + i++; //Returns 2, expecting 3

Известно как приращение поста. Сначала будет использовано значение, а затем увеличено. Это эквивалентно

i = i + i;
i = i+1;

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

i = i++ + i; //Returns 3

эквивалентно

i = i+1;
i = i + i;

i = i+++i; // is it i + ++i or i++ + i?

интерпретируется как

i = i + 1; i = i + i;

и это

i = i---i; // is it i - --i or i-- - i?

интерпретируется как

i= i-1;
i = i-i; 
person Ehsan    schedule 07.10.2013

Существует разница между пре-инкрементом (++i) и пост-инкрементом (i++). Разница в следующем:

Pre-increment добавит значение перед использованием результата. Пост-инкремент будет использовать результат.. затем добавить значение. Итак, ваш первый пример:

int i;

i = 1;
i = i + i++; // First use equals 1, second use equals one. After this line though
             // i equals 2, because of your use of post-increment.

Аналогично, ваш второй пример:

i = 1;
i = i++ + i; // First use is 1. After the first use.. it is incremented..
             // The second use it is 2. Therefore, 1 + 2 == 3.

Что касается вашего последнего вопроса... почему бы не поместить его в консольное приложение и не попробовать самому?

person Simon Whitehead    schedule 07.10.2013

Я думаю, что лучший способ понять это — посмотреть, что из этого делает компилятор.

См. здесь для обзора этого для случая

x=i-- - --i;

https://stackoverflow.com/a/8573429/959028

наилучшие пожелания

person Wim Reymen    schedule 07.10.2013

Приоритет оператора увеличения или уменьшения всегда выше, чем у арифметических операторов, таких как + - * /
См. http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx для получения подробной информации. Также значение постфиксного оператора увеличения или уменьшения действует только после текущего оператора. Например:

i = i + i++ = 1 + 1++ = 1 + 1 = 2; // value of i is effective after increament is done
i = i++ + i = 1++ + 2 = 3; //Next value of i contains updated value i.e. 2
i = i + ++i = 1 + ++1 = 1 + 2 = 3; //Next value of i contains updated value i.e. 2
i = ++i + i = ++1 + i = 2 + 2; //Both value of i contains updated value i.e. 2 because of prefixed operator
i = i+++i = i++ + i;
i = i---i = i-- - i;
person Adarsh Kumar    schedule 07.10.2013