Увеличитель прихода в С#
Пока я тестирую оператор 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);
На этот раз выход был прав. Что изменилось с первого образца?
Ответы
Ответ 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