1

私は、通常のブール演算子の代わりに条件付きブール演算子 (ショートサーキットとも呼ばれます) を使用しても、式の結果には影響しないと常に信じてきました。

var result = true | false & false;

と同じ結果になります

var result = true || false && false

両方の式の結果は になりtrueます。

しかし、通常の演算子と条件付き演算子を混在させるとどうなるでしょうか?

var result1 = true || false & false;
var result2 = true | false && false;

あなたは何を期待しますか?これらはまだ戻ってくると思いtrueます。しかし、そうではありません。Result2 はfalse!

これはoperator precedenceが原因であることはわかっています。優先順位は& | && ||です。これは私には直感に反するようです。その場合、すべての結果は同じになります(私& && | ||は思います)。

したがって、私の本当の質問は、短絡が結果を変えることができるかどうかではないと思います. 問題は、なぜ短絡によって結果変わるような優先順位になっているのかということです。

4

3 に答える 3

2
var result2 = true | false && false;

次のように計算されます。

var result2 = (true | false) && false;

|前に来るから&&(true | false)に評価されるようtrueになり、true && falsefalseになります。

理由については、次の質問を参照してください。

&& と || 演算子は、「短絡」動作のために後で追加されました。Dennis Ritchie は振り返ってみると、論理演算子が追加されたときにビット演算子の優先順位を変更する必要があったことを認めています。しかし、その時点で存在していた数百キロバイトの C ソース コードと 3 台のコンピューターのインストール ベースを考えると、デニスは C 言語の変更は大きすぎると考えました...

于 2013-02-03T11:32:30.940 に答える
1

問題の演算子の優先順位は、C (および C++) プログラミング言語の優先順位から直接コピーされているようです。

現在Cでは、整数とブール値に個別の型を使用していません。たとえば、次のように書くことができます。

if (i | j && x > 0)      // cf. the result2 of your question

これは、「整数ijビットごとの論理和がゼロ以外の何かを与え、数値xが正である」ことを意味するはずです。そのため|、 and&はオペランドが整数 (多ビット数) と見なされる場合に主に使用されると想定されており、||and&&はオペランドがブール値と見なされる場合に主に使用されると想定されています。

|したがって、C ではより厳密にバインドするのが自然に思えるかもしれません&&

C# では型安全性が高く、 から へ、または から への変換はInt32ありBooleanませBooleanInt32。したがって、物事を「混ぜる」ことができなくなり、優先順位が自然に感じられなくなります。

理論的にはC#で、演算子を作成できると思います

public static bool operator |(bool b, bool c)

演算子とは異なる優先順位を持つ

public static int operator |(int i, int j)

しかし、それは本当に物事を良くしないでしょうか?

ブール型の非短絡演算子 like|と短絡演算子 like&&を同じ式で使用することは非常にまれだと思います()。また、意図をより明確にします)。

于 2013-02-03T21:25:46.463 に答える
0

& と | 演算子は両方の引数を評価し (これにはメソッドの呼び出しが含まれる場合があります)、and または or 演算の結果を返します。

&& と || 演算子は、最終結果が完全に決定されるポイントまで引数を評価するだけです。

例: true | SomeMethod()and false & SomeMethod()は SomeMethod() 関数 true || SomeMethod()を 呼び出しますが、呼び出しfalse && SomeMethod()ません。

trueもちろん、falseこの例では変数も使用できます。例を理解しやすくするために、単に定数を使用しました。

于 2013-02-03T11:35:31.517 に答える