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看看短路发生了什么。