web-dev-qa-db-fra.com

XOR conditionnel?

Comment se fait-il que C # n’ait pas d’opérateur conditionnel XOR?

Exemple:

true  xor false = true
true  xor true  = false
false xor false = false
73
Gilad Naaman

En C #, les opérateurs conditionnels n'exécutent leur opérande secondaire que si nécessaire .

Comme un XOR must par définition teste les deux valeurs, une version conditionnelle serait idiote.

Exemples:

  • ET logique: & - teste les deux côtés à chaque fois.

  • OU logique: | - Testez les deux côtés à chaque fois.

  • Conditionnel AND: && - teste uniquement le 2ème côté si le 1er côté est vrai.

  • OU conditionnel: || - Ne testez le 2ème côté que si le 1er est faux.

106
The Evil Greebo

La question est un peu dépassée mais ...

Voici comment cet opérateur devrait fonctionner:

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

Voici comment! = Operator fonctionne avec les types bool:

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

Donc, comme vous le voyez, ^^ Non existant peut être remplacé par un != Existant

238
piotrpo

Il y a l'opérateur logique XOR: ^

Documentation: opérateurs C # et opérateur ^

25
iceaway

Juste pour clarifier, l'opérateur ^ travaille avec les types intégraux et bool.

Voir Opérateur ^ de MSDN (référence C #) :

Les opérateurs binaires ^ sont prédéfinis pour les types intégraux et bool. Pour les types intégraux, ^ calcule le OU exclusif au niveau du bit de ses opérandes. Pour les opérandes bool, ^ calcule l'exclusivité logique de ses opérandes; c'est-à-dire que le résultat est vrai si et seulement si exactement un de ses opérandes est vrai.

La documentation a peut-être changé depuis 2011, année où cette question a été posée.

23
RichardCL

Comme demandé par Mark L , voici la version correcte:

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

Voici la table de vérité:

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

Référence: OR exclusif

11
Simple Fellow

Oh oui, c'est le cas.

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
4
Armen Tsirunyan

Le xor conditionnel n'existe pas, mais vous pouvez en utiliser un logique car xor est défini pour les booléens et toutes les comparaisons conditionnelles sont évaluées en booléens.

Donc, vous pouvez dire quelque chose comme:

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

}
4
Klark

Bien qu'il y ait un opérateur logique xor ^, il n'y a pas d'opérateur conditionnel xor. Vous pouvez obtenir un xor conditionnel de deux valeurs A et B en utilisant les éléments suivants:

A ? (!B) : B

Les parens ne sont pas nécessaires, mais je les ai ajoutés pour plus de clarté.

Comme indiqué par The Evil Greebo, ceci évalue les deux expressions, mais xor ne peut pas être court-circuité comme and et o.

3
jimreed

vous pouvez utiliser:

a = b ^ c;

juste comme dans c/c ++

1
gulyan

Il n’existe pas de XOR conditionnel (court-circuit). Les opérateurs conditionnels ne sont significatifs que lorsqu'il existe un moyen de dire de manière définitive le résultat final en ne regardant que le premier argument. XOR (et addition) nécessite toujours deux arguments, il n'y a donc aucun moyen de court-circuiter après le premier argument.

Si vous connaissez A = true, alors (A XOR B) =! B.

Si vous connaissez A = false, alors (A XOR B) = B.

Dans les deux cas, si vous connaissez A mais pas B, vous ne savez pas assez pour savoir (A XOR B). Vous devez toujours apprendre les valeurs de A et de B afin de: calculer la réponse. Il n'y a littéralement aucun cas d'utilisation où vous pouvez jamais résoudre le XOR sans les deux valeurs.

Gardez à l'esprit, XOR a par définition quatre cas:

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

Encore une fois, il est clair d'après ce qui précède que la connaissance de la première valeur n'est jamais suffisante pour obtenir la réponse sans connaître également la deuxième valeur. Cependant, dans votre question, vous avez omis le premier cas. Si tu voulais plutôt

false op true  = false (or DontCare)
true  op false = true
true  op true  = false
false op false = false

alors vous pouvez effectivement obtenir cela en court-circuitant une opération conditionnelle:

A && !B

Mais ce n'est pas un XOR.

0
Kevin Holt