C#条件AND(&&)或(||)优先

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

根据MSDN AND(&&)比OR(||)具有更高的优先级。 但是,你能向一个怀疑的同事certificate吗?

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 

所以我的问题是你如何certificate与AND(&&)具有更高的优先级OR(||)的代码? 如果你的答案是无关紧要的,那么为什么它是用这种语言build立的呢?

通过改变第一个假。 我知道有(真正的)真正的愚蠢,但它certificate了你的观点。

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

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

如果你真的想把他吓跑,试试:

 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会被打印出来 – 接着是expression式的结果,也就是True

但由于|的更高优先级 , true | false true | false首先被评估(导致为true ), 然后结果是&&false以产生false

我并没有试图显示评估的顺序,只是事实的右侧的一半 被评估期间,通常不会:)

这不会得到你以后的东西吗? 或者,也许我错过了一些东西…

 bool result = true || false && false; 

false || 真的&&真的

产量:是的

假&&真正|| 真正

产量:是的

当布尔expression式被短路时,你不能只显示最终的结果。 这是一个解决你的情况的片段。

它依靠实施&和| &&和||所使用的运算符,如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看看短路发生了什么。

Interesting Posts