Путание использования запятой в, 'если' оператор

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

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

Но как это посмотрело бы в C#?

13
задан Peter Mortensen 21 August 2016 в 15:13
поделиться

3 ответа

Это означает следующее:

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

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

inhi = (y[0]>y[1]);
ini = !inhi;
14
ответ дан 1 December 2019 в 21:52
поделиться

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

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

9
ответ дан 1 December 2019 в 21:52
поделиться

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

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, сообщая об этом компилятору.

1
ответ дан 1 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: