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