Запутанное использование запятой в операторе if - PullRequest
13 голосов
/ 26 февраля 2010

У меня есть этот кусок кода на C ++:

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);

Но как бы это выглядело в C #?

Ответы [ 3 ]

14 голосов
/ 26 февраля 2010

Это значит:

if (y[0]>y[1])
{
    inhi = 1;
    ihi = 0;
} else {
    inhi = 0;
    ihi = 1;
}

Или написано по-другому (на С ++):

inhi = (y[0]>y[1]);
ini = !inhi;
9 голосов
/ 26 февраля 2010

Оператор запятой связывается ниже, чем присваивание, поэтому выражение

inhi=1,0

устанавливает inhi на 1, а затем возвращает 0. Аналогично

inhi=0,1

устанавливает inhi в 0 и возвращает 1. Все это эквивалентно

if(y[0] > y[1]) {
   inhi = 1;
   ihi = 0;
} else {
   inhi = 0;
   ihi = 1;
}

Я бы предложил переписать это таким образом, если вы можете. inhi и ihi, кажется, имеют ту же цель (в этом утверждении), и комбинация троичного оператора (?:) и оператора запятой, которые вы получили, придают им различный вес.

1 голос
/ 26 февраля 2010

Оператор запятой по очереди оценивает аргументы, а затем возвращает последнее вычисленное выражение. То есть если у вас был следующий код

int four = 2 + 2, mul(2,2), 4;

неоптимизирующий компилятор строго следующих за спецификацией сначала добавил бы 2 и 2, а затем отбросил бы результат, затем вызвал функцию mul и отбросил возвращаемое значение и, наконец, оценил 4, который затем назначается i переменная.

Обратите внимание, что после каждой запятой есть точка последовательности , поэтому все побочные эффекты предыдущих оценок будут выполнены. Например. в

ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);

присвоение inhi выполнено и завершено до обновления ihi. И это также означает, что компилятор не может оптимизировать вызов mul в приведенном выше примере, если он не знает на 100% наверняка, что функция mul не имеет никаких побочных эффектов, кроме возврата значения. Обычно это не то, что знает компилятор, хотя в C ++ можно пометить функции как const, с помощью которых компилятору сообщают об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...