XOR conditionnel?

Comment se fait-il que C # ne possède pas d’opérateur XOR conditionnel?

Exemple:

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

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

    Comme un XOR doit par définition tester les deux valeurs, une version conditionnelle serait idiot.

    Exemples :

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

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

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

    • Conditionnel OU: || – testez uniquement le 2ème côté si le 1er côté est faux.

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

    C’est comment cet opérateur doit fonctionner:

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

    Voici comment! = L’opérateur travaille avec les types bool:

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

    Donc, comme vous voyez inexistant ^^ peut être remplacé par existant !=

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

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

    Juste pour clarifier, l’opérateur ^ travaille à la fois avec les types intégraux et les bool.

    Voir l’opérateur ^ MSDN (référence C #) :

    Les opérateurs binarys sont prédéfinis pour les types intégraux et bool. Pour les types intégraux, ^ calcule le OU exclusif binary de ses opérandes. Pour les opérandes bool, ^ calcule l’exclusif logique ou de ses opérandes; c’est-à-dire que le résultat est vrai si et seulement si exactement l’un de ses opérandes est vrai.

    La documentation a peut-être changé depuis 2011 lorsque cette question a été posée.

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

      Func 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: Exclusif OU

    Oh oui, ça le fait.

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

    Le xor conditionnel n’existe pas, mais vous pouvez utiliser le premier 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 xor logique ^ , il n’y a pas d’opérateur xor conditionnel . Vous pouvez obtenir un xor conditionnel de deux valeurs A et B en utilisant ce qui suit:

     A ? (!B) : B 

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

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

    vous pouvez utiliser:

     a = b ^ c; 

    comme dans c / c ++

    Cette question a reçu une réponse affective, mais je suis tombé sur une situation différente. C’est vrai qu’il n’y a pas besoin d’un XOR conditionnel. Il est également vrai que l’opérateur ^ peut être utilisé. Cependant, si vous devez uniquement tester le statut “true || false” des opérandes, alors ^ peut provoquer des problèmes. Par exemple:

     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... } } 

    Dans cet exemple, si left est défini sur 10 (0xa) et que right est défini sur 5 (0x5), la twig “success” est entrée. Pour cet exemple (simpliste si bête), cela entraînerait un bogue puisque vous ne devriez pas tourner à gauche et à droite en même temps. Ce que j’ai compris du questionneur, ce n’est pas qu’il voulait en fait un conditionnel, mais un moyen simple d’exécuter le true / false sur les valeurs transmises au xor.

    Une macro pourrait faire l’affaire:

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

    N’hésitez pas à me gifler si je ne suis pas sur la bonne voie: o)

    J’ai lu la réponse de Jimreed ci-dessous après que j’ai posté ceci (mauvais Yapdog!) Et son est en fait plus simple. Ça marcherait et je ne sais absolument pas pourquoi sa réponse a été rejetée …