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
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.
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
Il y a l'opérateur logique XOR: ^
Documentation: opérateurs C # et opérateur ^
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.
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
Oh oui, c'est le cas.
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
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))
{
}
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.
vous pouvez utiliser:
a = b ^ c;
juste comme dans c/c ++
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.