2

排他的論理和 (2 つのオペランドの場合は XOR と呼ばれます) 演算子を複数の述語に適用する方法はありますか?

たとえばpqrが 3 つの述語 (つまり、ブール変数) であるとします。if以下のような条件を書きたいと思います。

if ((p || q || r) && !(p && q && r))

つまり、条件の少なくとも 1 つが true であるが、すべてが true ではない場合、条件を true にする必要があります。

どうやらif (p ^ q ^ r)動作しないようです (ケースp=trueq=trueを考慮してくださいr=false)

ありがとうございました。


C言語については良い回答が得られましたが、 C#に解決策があることを知るのは興味深いことです。

4

3 に答える 3

3

これを行う1つの方法は次のとおりです。

if ((!!p + !!q + !!r) % 3)

しかし、それはおそらくそれ自体の利益のためには巧妙すぎるでしょう。

編集:

if (((p ? 1 : 0) + (q ? 1 : 0) + (r ? 1 : 0)) % 3 != 0)  // C#-compatible version
于 2012-11-25T00:24:51.643 に答える
2

あなたが望むのは、実際には 3 つ以上の引数に適用される XOR ではないため、タイトルからの質問は誤解を招くものです。XOR の一般化は基本的に、真の値の数が奇数であるかどうかをチェックすることであり、これは(p ^ q ^ r)式が計算するものです。

Cには、条件をチェックする演算子がないため(「少なくとも1つは真ですが、すべてではありません」)、次のように表記します。

((p || q || r) && !(p && q && r))

Cで最も慣用的なようです。

于 2012-11-25T00:24:51.343 に答える
-2
if (((p ^ q) ^ r)&!(p&q&r)) should work in your example

http://en.wikipedia.org/wiki/Exclusive_or

于 2012-11-25T00:20:57.997 に答える