Условные гаммирования?
почему C# не имеет условного XOR
оператор?
пример:
true xor false = true
true xor true = false
false xor false = false
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
ссылка: эксклюзивный или
условный xor не существует, но вы можете использовать логический, потому что xor определен для булевых значений, и все условные сравнения оцениваются как булевы.
Так что вы можете сказать что-то вроде:
if ( (a == b) ^ (c == d)) { }
хотя есть логическое оператор xor
^
нет условный оператор xor. Вы можете получить условное xor из двух значений A и B, используя следующее:A ? (!B) : B
родители не нужны, но я добавил их для ясности.
Как указал злой Greebo, это оценивает оба выражения, но xor не может быть закорочен, как и и или.
на этот вопрос был дан эмоциональный ответ, но я столкнулся с другой ситуацией. Это правда, что нет необходимости в условном 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!) и его на самом деле проще. Это сработало бы и я понятия не имею, почему его ответ был отклонен...