84

我们一直在我的工作中陷入不必要的编码争论。今天我问条件 AND (&&) 或 OR (||) 是否具有更高的优先级。我的一位同事坚持说他们有相同的优先级,我有疑问,所以我查了一下。

根据 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),然后将该结果&&falseyield结合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 回答