84

私の仕事では、常に不必要なコーディングの議論に巻き込まれます。今日、条件付き AND (&&) と OR (||) のどちらが優先されるかを尋ねました。私の同僚の 1 人が、それらの優先順位は同じだと主張しました。

MSDN によると、AND (&&) は OR (||) よりも優先順位が高くなります。しかし、懐疑的な同僚にそれを証明できますか?

http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false

だから私の質問は、AND (&&) が OR (||) よりも優先順位が高いことをコードでどのように証明するのですか? あなたの答えが問題ではないという場合、言語でそのように構築されているのはなぜですか?

4

6 に答える 6

125

最初の false を true に変更します。(true || true) を持つのはばかげているように思えますが、それはあなたの主張を証明しています。

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true
于 2009-07-28T21:06:46.640 に答える
13

本当に彼を驚かせたい場合は、次のことを試してください。

bool result = True() | False() && False();

Console.WriteLine("-----");
Console.WriteLine(result);

static bool True()
{
    Console.WriteLine(true);
    return true;
}

static bool False()
{
    Console.WriteLine(false);
    return false;
}

これは印刷されます:

True
False
False
-----
False

編集:

コメントに応じて:

C# では、|は と同じブール論理を実行する||が短絡しない論理演算子です。また、C# では、演算子はと|の両方よりも優先されます。||&&

||値を出力すると、典型的な演算子を使用した場合、最初の値だけが出力Trueされ、続いて式の結果が出力されることがわかりますTrue

しかし、 の優先順位の方が高いため、|true | false最初に評価され (結果はtrue)、次にその結果が で&&編集されfalseて yield になりfalseます。

評価の順序を示す|つもりはありませんでした。通常はそうではない期間の右半分が評価されたという事実だけです:)

于 2009-07-28T21:35:29.750 に答える
6

これはあなたが求めているものを手に入れませんか?それとも、何かが足りないのかもしれません...

bool result = true || false && false;
于 2009-07-28T21:05:22.743 に答える
5

コードではなくロジックで証明します。AND はブール乗算ですが、OR はブール加算です。では、どちらの優先順位が高いでしょうか。

于 2009-07-28T21:08:52.767 に答える
2

|| 偽 || 真 && 真

利回り: 真

偽 && 真 || 真実

利回り: 真

于 2009-07-28T21:07:40.663 に答える
-5

ブール式が短絡しているときに、最終結果を表示することはできません。これがあなたのケースを解決するスニペットです。

& と | の実装に依存しています。&& および || で使用される演算子 ( MSDN 7.11 条件付き論理演算子に記載)

public static void Test()
{
    B t = new B(true);
    B f = new B(false);

    B result = f || t && f;

    Console.WriteLine("-----");
    Console.WriteLine(result);
}

public class B {
    bool val;
    public B(bool val) { this.val = val; }
    public static bool operator true(B b) { return b.val; }
    public static bool operator false(B b) { return !b.val; }
    public static B operator &(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " & " + rhs.ToString());
        return new B(lhs.val & rhs.val); 
    }
    public static B operator |(B lhs, B rhs) { 
        Console.WriteLine(lhs.ToString() + " | " + rhs.ToString());
        return new B(lhs.val | rhs.val); 
    }
    public override string ToString() { 
        return val.ToString(); 
    }
}

出力は、&& が || の前に最初に評価されることを示しているはずです。

True & False
False | False
-----
False

さらにお楽しみいただくために、result = t || で試してみてください。t && f ショートサーキットで何が起こるか見てみましょう。

于 2009-07-28T23:38:45.320 に答える