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

Увеличитель прихода в С#

Пока я тестирую оператор post increment в простом консольном приложении, я понял, что я не понимаю полной концепции. Мне кажется странным:

int i = 0;
bool b = i++ == i;
Console.WriteLine(b);

Результат был ложным. Я ожидал, что это будет правда. AFAIK, в строке 2, из-за приращения post компилятор сравнивает и присваивает значение b true, после того, как я увеличился на единицу. Но, очевидно, я ошибаюсь. После этого я изменяю код следующим образом:

int i = 0;
bool b = i == i++;
Console.WriteLine(b);

На этот раз выход был прав. Что изменилось с первого образца?

4b9b3361

Ответ 1

Предположим, что i имеет значение 0, как и в ваших примерах.

i++ == i читает i (0), увеличивает i, снова читает i (1) и сравнивает два значения: 0 == 1.

i == i++ читает i (0), снова читает i (0), увеличивает i и сравнивает два значения: 0 == 0.

Приращение происходит сразу после прочтения старого значения.

Ответ 2

Отвечая на ваш первый фрагмент кода:

Здесь bool b = i++ == i; есть 0 == 1, и это потому, что, как вы знаете, i++ - это приращение, поэтому i остается 0 в i++, но после того, как эта часть завершена, и ее сравнивают с правой стороны, которая равна i, к этому времени значение изменилось на 1 из-за предыдущего приращения. Вот почему вы получаете False при выполнении: bool b = i++ == i;.

Как и @hvd сказал: Приращение происходит сразу после прочтения старого значения.

Ответ 3

Порядок оценки postfix и оператора равенства слева направо, поэтому код ведет себя так, как описано в комментариях кода.

int i = 0;
bool b = i++ == i;
// 1.) i++ returns old value i.e. 0
// 2.) but after that it increments and becomes 1
// 3.) hence, bool b = 0 == 1; --> evaluates to false
Console.WriteLine(b); // prints false

int i = 0;
bool b = i == i++;
// 1.) i returns old value i.e. 0
// 2.) i++ returns old value i.e. 0, as this is the end of the statement after that it would increment
// 3.) hence, bool b = 0 == 0; --> evaluates to true
Console.WriteLine(b); // prints true