XOR
C# に条件演算子がないのはなぜですか?
例:
true xor false = true
true xor true = false
false xor false = false
XOR
C# に条件演算子がないのはなぜですか?
例:
true xor false = true
true xor true = false
false xor false = false
条件付き 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
ご覧のとおり、存在しない^^
ものは既存のものに置き換えることができます!=
。
C# では、条件演算子は必要に応じて 2 次オペランドのみを実行します。
XORは定義により両方の値をテストする必要があるため、条件付きバージョンはばかげています。
例:
論理 AND: &
- 毎回両側をテストします。
論理 OR: |
- 毎回両側をテストします。
条件付き AND: &&
- 1 番目の側が true の場合、2 番目の側のみをテストします。
条件付き OR: ||
- 1 番目の側が false の場合、2 番目の側のみをテストします。
明確にするために、^ 演算子は整数型とブール型の両方で機能します。
MSDN の ^ 演算子 (C# リファレンス)を参照してください。
二項 ^ 演算子は、整数型と bool に対して事前定義されています。整数型の場合、^ はそのオペランドのビットごとの排他的 OR を計算します。bool オペランドの場合、^ はそのオペランドの排他的論理和を計算します。つまり、そのオペランドの 1 つだけが true である場合にのみ、結果が true になります。
この質問がされた2011年以降、ドキュメントが変更された可能性があります。
ああ、そうです。
bool b1 = true;
bool b2 = false;
bool XOR = b1 ^ b2;
条件付き xor は存在しませんが、xor はブール値に対して定義されており、すべての条件付き比較はブール値として評価されるため、論理値を使用できます。
したがって、次のように言えます。
if ( (a == b) ^ (c == d))
{
}
論理xor 演算子はありますが、条件付き^
xor 演算子はありません。以下を使用して、2 つの値 A と B の条件付き xor を実現できます。
A ? (!B) : B
括弧は必須ではありませんが、わかりやすくするために追加しました。
The Evil Greebo で指摘されているように、これは両方の式を評価しますが、 xor をandやorのように短絡することはできません。
あなたが使用することができます:
a = b ^ c;
c/c++ と同じように
この質問は感情的に答えられましたが、別の状況に遭遇しました. 条件付き 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)
これを投稿した後、以下のジムリードの回答を読みました(悪いヤップドッグ!)が、実際には彼の方が簡単です。それはうまくいくだろうし、なぜ彼の答えが反対票を投じられたのか、私にはまったくわからない...