[英]C# conditional AND (&&) OR (||) precedence
我们一直在工作中进入不必要的编码论证。 今天我询问条件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(||)? 如果你的答案无关紧要,那么为什么用这种语言建立?
将第一个false更改为true。 我知道这似乎很愚蠢(真实|| true),但它证明了你的观点。
bool result = true || true && false; // --> true
result = (true || true) && false; // --> false
result = true || (true && false); // --> true
如果你真的想吓到他,试试:
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
(结果为true
), 然后将结果&&
ed为false
以产生false
。
我是不是要显示计算顺序,只是事实的右半|
被评估期间通常不会:)
这不会让你得到你想要的东西吗? 或者也许我错过了一些东西......
bool result = true || false && false;
你不是用代码证明它,而是用逻辑证明它。 AND是布尔乘法,而OR是布尔加法。 现在哪个优先级更高?
假|| 真&&真
收益率:真实
false && true || 真正
收益率:真实
当布尔表达式被短路时,您不能只显示最终结果。 这是一个解决您案件的片段。
它依赖于实现&和| &&和||使用的运算符,如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并看看短路会发生什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.