95

XORC# に条件演算子がないのはなぜですか?

例:

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

11 に答える 11

310

条件付き xor は次のように機能する必要があります。

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

しかし、これは!=演算子が bool 型で実際にどのように動作するかです:

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

ご覧のとおり、存在しない^^ものは既存のものに置き換えることができます!=

于 2013-02-02T18:02:05.877 に答える
130

C# では、条件演算子は必要に応じて 2 次オペランドのみを実行します。

XOR定義により両方の値をテストする必要があるため、条件付きバージョンはばかげています。

:

  • 論理 AND: &- 毎回両側をテストします。

  • 論理 OR: |- 毎回両側をテストします。

  • 条件付き AND: &&- 1 番目の側が true の場合、2 番目の側のみをテストします。

  • 条件付き OR: ||- 1 番目の側が false の場合、2 番目の側のみをテストします。

于 2011-06-28T14:17:36.140 に答える
30

論理 XOR 演算子があります。^

ドキュメント: C# 演算子^ 演算子

ドキュメントには^、 がブール オペランドと一緒に使用された場合、 がブール演算子であることが明示的に記載されています。

「bool オペランドの場合、^ 演算子は不等号演算子 != と同じ結果を計算します。

(そして、別の回答で述べたように、それはまさにあなたが望むものです)。

^ を使用して整数オペランドをビット単位で xor することもできます。

于 2011-06-28T14:15:00.127 に答える
25

明確にするために、^ 演算子は整数型とブール型の両方で機能します。

MSDN の ^ 演算子 (C# リファレンス)を参照してください。

二項 ^ 演算子は、整数型と bool に対して事前定義されています。整数型の場合、^ はそのオペランドのビットごとの排他的 OR を計算します。bool オペランドの場合、^ はそのオペランドの排他的論理和を計算します。つまり、そのオペランドの 1 つだけが true である場合にのみ、結果が true になります。

この質問がされた2011年以降、ドキュメントが変更された可能性があります。

于 2016-06-13T11:50:47.507 に答える
5

ああ、そうです。

bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
于 2011-06-28T14:15:29.743 に答える
4

条件付き xor は存在しませんが、xor はブール値に対して定義されており、すべての条件付き比較はブール値として評価されるため、論理値を使用できます。

したがって、次のように言えます。

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

}
于 2011-06-28T14:19:51.040 に答える
3

論理xor 演算子はありますが、条件付き^xor 演算子はありません。以下を使用して、2 つの値 A と B の条件付き xor を実現できます。

A ? (!B) : B

括弧は必須ではありませんが、わかりやすくするために追加しました。

The Evil Greebo で指摘されているように、これは両方の式を評価しますが、 xor をandorのように短絡することはできません。

于 2011-06-28T14:21:41.120 に答える
1

あなたが使用することができます:

a = b ^ c;

c/c++ と同じように

于 2011-06-28T14:16:09.470 に答える
-3

この質問は感情的に答えられましたが、別の状況に遭遇しました. 条件付き 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...
    }
}

この例では、左が 10 (0xa) に設定され、右が 5 (0x5) に設定されている場合、「成功」ブランチに入ります。この (ばかげているが単純な) 例では、左と右を同時に曲がってはならないため、バグが発生します。私が質問者から集めたのは、彼が実際に条件付きを望んでいたということではなく、xor に渡された値に対して true/false を実行する簡単な方法でした。

マクロはトリックを行うことができます:

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

私が的外れな場合は、遠慮なく平手打ちしてください:o)

これを投稿した後、以下のジムリードの回答を読みました(悪いヤップドッグ!)が、実際には彼の方が簡単です。それはうまくいくだろうし、なぜ彼の答えが反対票を投じられたのか、私にはまったくわからない...

于 2012-08-20T23:08:01.537 に答える