Это крайне плохая практика программирования , которую вы используете.Условные выражения должны не иметь побочные эффекты;они должны вычислять значения .Вы выполняете побочный эффект, а затем выбрасываете его!Вы должны (1) сделать версию без побочных эффектов:
id = (isChar && id > 121) ? 65 : id + 1;
или (2) написать свою версию с побочными эффектами в виде операторов , а не выражений :
if (isChar && id > 121)
id = 65;
else
id++;
Давайте более подробно рассмотрим, что не так с этой упрощенной версией исходного кода с ошибками:
id = whatever ? 65 : id++;
Предположим, whatever
неверно.Что просходит?id++
морально эквивалентно:
int PostIncrement(ref int x)
{
int temp = x;
x = temp + 1;
return temp;
}
Итак, предположим, вы сделали:
id = whatever ? 65 : PostIncrement(ref id);
Что происходит?Предположим, что id
равно 1. Вы передаете его по ссылке PostIncrement
.PostIncrement
делает копию значения id
- 1 - в temp
.Затем он добавляет один к этому - 2 - и присваивает результат id
.Таким образом, id
теперь равно 2. Затем возвращается 1.
Вернувшись в вызывающую сторону, id
теперь равно 2, а затем вы присваиваете результат PostIncrement
, который был 1, а теперь id
снова равен 1.
Не используйте id++
для обозначения id + 1
, потому что это совсем не то, что оно означает.