Вложенные встроенные операторы IF - PullRequest
3 голосов
/ 07 марта 2012

Я немного запутался, почему это не работает:

id = (isChar ? (id + 1 > 122 ? 65 : id++) : id++);

Входные данные могут быть либо int, либо char, преобразованными в INT.Затем я увеличиваю id и увеличиваю либо int, либо char.Проблема в том, что при вводе символа число не меняется?

Ответы [ 3 ]

14 голосов
/ 07 марта 2012

Это крайне плохая практика программирования , которую вы используете.Условные выражения должны не иметь побочные эффекты;они должны вычислять значения .Вы выполняете побочный эффект, а затем выбрасываете его!Вы должны (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, потому что это совсем не то, что оно означает.

7 голосов
/ 07 марта 2012

Измените id++ на id + 1 в обоих случаях.Вы отбрасываете изменение из приращения в присваивании, которое выполняется последним.

Как правило, избегайте побочных эффектов (таких как ++) в сложных выражениях.Они делают все выражение неразрешимым.Это сбило вас с толку.

Еще лучше, увеличивайте id заранее, так как вы всегда , кажется, увеличиваете его:

id += 1;
if (isChar && id > 122)
    id = 65;

или

id = (isChar && id > 121) ? 65 : id + 1;
0 голосов
/ 07 марта 2012

Остальные ответы верны.Сначала вы должны рассмотреть их совет, однако это можно исправить, просто поместив оператор ++ перед переменной, то есть ++id.

По сути, установка ++ после вашей переменной (операция приращения с постфиксом) возвращает значение переменной до того, как произойдет приращение.Перемещая ++ перед вашей переменной (операция приращения префикса), он возвращает значение переменной после выполнения приращения.Обратите внимание, что в обоих случаях увеличенное значение все еще сохраняется в переменной, затрагивается только значение, возвращаемое операцией.

См. ++ Оператор (C # Reference) для получения дополнительной информации.

...