Путаное использование запятой в выражении "if"

У меня есть эта часть кода в С++:

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

Но как бы он выглядел на С#?

Ответы

Ответ 1

Это означает:

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

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

inhi = (y[0]>y[1]);
ini = !inhi;

Ответ 2

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

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, похоже, имеют ту же цель (в этом утверждении), и тройной оператор комбинации (?:) и оператор запятой, который у вас есть, дают им разный вес.

Ответ 3

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

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 не имеет никаких побочных эффектов, кроме возврата значения. Обычно это не то, что компилятор знает, хотя в С++ можно отметить функции как const, которым сообщается компилятору.