C#条件AND(&&)OR(||)优先级

时间:2009-07-28 21:00:04

标签: c# conditional conditional-operator operator-precedence associativity

我们一直在工作中进入不必要的编码论证。今天我询问条件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(||)?如果你的答案无关紧要,那么为什么用语言建立这种方式呢?

6 个答案:

答案 0 :(得分:101)

将第一个false更改为true。我知道这有点愚蠢(真实|| true),但它证明了你的观点。

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true

答案 1 :(得分:10)

如果你真的想吓到他,请尝试:

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 - 后跟表达式的结果{{ 1}}也。

但由于True的优先级较高,|首先得到评估(产生true | false),然后然后得到true使用&&编辑以获得false

我并没有试图显示评估的顺序,只是false的右半部分是通常不会被评估的时期:)

答案 2 :(得分:6)

这不会让你得到你想要的东西吗?或者也许我错过了一些东西......

bool result = true || false && false;

答案 3 :(得分:5)

你不是用代码证明它,而是用逻辑证明它。 AND是布尔乘法,而OR是布尔加法。现在哪一个有更高的优先权?

答案 4 :(得分:0)

false ||真实&&真

收益率:真实

false&&真||真

收益率:真实

答案 5 :(得分:-5)

当您的布尔表达式被短路时,您不能只显示最终结果。这是一个解决您案件的片段。

它依赖于实施&和| &&和和||,如MSDN 7.11 Conditional logical operators

中所述
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看看短路会发生什么。