在我的工作中,我们总是陷入不必要的编码争论。今天我问条件 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 || 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
运算,得到 false
。
我并不是想展示评估的顺序,只是事实是,
|
的右半部分被评估了,而通常情况下不会:)
这难道不会得到你想要的吗?或者也许我错过了一些东西......
bool result = true || false && false;
你不用代码来证明它,而是用逻辑来证明。 AND 是布尔乘法,而 OR 是布尔加法。现在哪一个优先级更高?
false || true && true
产量:
true
false && true || true
产量:
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 看看短路会发生什么。