Ответ 1
Это означает:
if (y[0]>y[1])
{
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
Или написано другим способом (на С++):
inhi = (y[0]>y[1]);
ini = !inhi;
У меня есть эта часть кода в С++:
ihi = y[0]>y[1] ? (inhi=1,0) : (inhi=0,1);
Но как бы он выглядел на С#?
Это означает:
if (y[0]>y[1])
{
inhi = 1;
ihi = 0;
} else {
inhi = 0;
ihi = 1;
}
Или написано другим способом (на С++):
inhi = (y[0]>y[1]);
ini = !inhi;
Оператор запятой связывается ниже назначения, поэтому выражение
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
, похоже, имеют ту же цель (в этом утверждении), и тройной оператор комбинации (?:
) и оператор запятой, который у вас есть, дают им разный вес.
Оператор запятой оценивает аргументы по очереди и затем возвращает последнее вычисленное выражение. То есть если у вас есть следующий код
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
, которым сообщается компилятору.