Условные гаммирования?


почему C# не имеет условного XOR оператор?

пример:

true  xor false = true
true  xor true  = false
false xor false = false
10 66

10 ответов:

в C# условные операторы выполняют только свой вторичный операнд при необходимости.

С XOR должны по определению проверить оба значения, условная версия будет глупо.

примеры:

  • логическое и: & - проверяет обе стороны каждый раз.

  • логическое или: | - проверьте обе стороны каждый раз.

  • условные и: && - проверяет только 2-ю сторону, если 1-я сторона истинна.

  • условное или: || - проверяйте только 2-ю сторону, если 1-я сторона ложна.

вопрос немного устарел, но...

вот как должен работать этот оператор:

true xor false = true
true xor true = false
false xor false = false

вот как != оператор работает с типами bool:

(true != false) // true
(true != true) // false
(false != false) // false

Итак, как вы видите несуществующих ^^ может быть заменен на существующий !=

существует логический оператор XOR:^

документы: Операторы C# и оператор^

Так же, как уточнение, оператор ^ работает как с целыми типами, так и с bool.

посмотреть оператор MSDN ^ (ссылка на C#):

бинарные ^ операторы предопределены для интегральных типов и bool. Для интегральных типов ^ вычисляет побитовое исключение-или его операндов. Для операндов bool ^ вычисляет логическое исключение-или его операндов; то есть результат истинен тогда и только тогда, когда точно один из его операндов истинный.

возможно, документация изменилась с 2011 года, когда был задан этот вопрос.

по поручению Марк L, вот правильная версия:

 Func<bool, bool, bool> XOR = (X,Y) => ((!X) && Y) || (X && (!Y));

Вот таблица истинности:

 X | Y | Result
 ==============
 0 | 0 | 0
 1 | 0 | 1
 0 | 1 | 1
 1 | 1 | 0

ссылка: эксклюзивный или

О да, это делает.

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;

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

Так что вы можете сказать что-то вроде:

if ( (a == b) ^ (c == d))
{

}

хотя есть логическое оператор xor ^ нет условный оператор xor. Вы можете получить условное xor из двух значений A и B, используя следующее:

A ? (!B) : B

родители не нужны, но я добавил их для ясности.

Как указал злой Greebo, это оценивает оба выражения, но xor не может быть закорочен, как и и или.

вы можете использовать:

a = b ^ c;

так же, как в c/C++

на этот вопрос был дан эмоциональный ответ, но я столкнулся с другой ситуацией. Это правда, что нет необходимости в условном XOR. Также верно, что оператор ^ может быть использован. Однако, если вам нужно только проверить состояние "true || false" операндов, то ^ может привести к проблемам. Например:

void Turn(int left, int right)
{
    if (left ^ right)
    {
        //success... turn the car left or right...
    }
    else
    {
        //error... no turn or both left AND right are set...
    }
}

в этом примере, если left имеет значение 10 (0xa), а right-5 (0x5), вводится ветвь "success". Для этого (упрощенного, если глупо) примера, это это приведет к ошибке, так как вы не должны поворачивать влево и вправо одновременно. То, что я собрал от вопрошающего, - это не то, что он действительно хотел условный, а простой способ выполнить true/false на значениях, переданных xor.

макрос может сделать трюк:

#define my_xor(a, b) ( ((a)?1:0) ^ ((b)?1:0) )

Не стесняйтесь ударить меня вокруг, если я не в курсе :o)

Я прочитал ответ джимрида ниже после того, как я опубликовал это (bad Yapdog!) и его на самом деле проще. Это сработало бы и я понятия не имею, почему его ответ был отклонен...