C#条件和(&;)或(| |)优先

C#条件和(&;)或(| |)优先,c#,conditional,conditional-operator,operator-precedence,associativity,C#,Conditional,Conditional Operator,Operator Precedence,Associativity,我们总是在我的工作中陷入不必要的编码争论。今天我问条件AND(&&)或or(| |)是否具有更高的优先级。我的一个同事坚持说他们有相同的优先权,我有疑问,所以我查了一下 根据MSDN和(&&)的优先级高于或(| |)。但是,你能向一个怀疑的同事证明这一点吗 所以我的问题是,如何用代码证明AND(&&)的优先级高于OR(| |)?如果你的答案是没关系,那么为什么在语言中它是这样构建的呢?这不就是你想要的吗?也许我错过了什么 bool result = true || false &&am

我们总是在我的工作中陷入不必要的编码争论。今天我问条件AND(&&)或or(| |)是否具有更高的优先级。我的一个同事坚持说他们有相同的优先权,我有疑问,所以我查了一下

根据MSDN和(&&)的优先级高于或(| |)。但是,你能向一个怀疑的同事证明这一点吗


所以我的问题是,如何用代码证明AND(&&)的优先级高于OR(| |)?如果你的答案是没关系,那么为什么在语言中它是这样构建的呢?

这不就是你想要的吗?也许我错过了什么

bool result = true || false && false;

将第一个false改为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
False | False
-----
False

为了获得额外的乐趣,请尝试使用result=t | | t&&f,看看短路会发生什么。

语言中是这样的,因为他们必须做出决定。就我个人而言,我不在乎哪个优先;我会用括号来确保我得到了预期的结果。问题不在于它为什么要这样做;这是关于当你在几周、几个月或几年后回到代码中时,你能弄清楚代码在做什么。@Jeff:那是不对的。这个决定有一个数学基础,叫做布尔代数。@TheSteve:短路不会影响表达式结果。它只会影响副作用。事实上,你甚至不得不考虑它不意味着你不应该依赖下一个家伙知道,如果有一个问题,办公室里的任何人可能需要花3秒的时间去思考它,然后投资5秒来添加A(A),让我看看我是否明白这一点。你的同事对这种语言很有信心。这种信念与规范和实现相矛盾。您的声明与规范和实现一致。那么为什么你是那个试图构造证据的人呢?举证责任在于有疯狂信仰的人,而不是有理智信仰的人。我不会再在这上面浪费时间了;如果他们想花时间证明错误,就让他们来吧。这区分了&&具有更高的优先级和| |具有更高的优先级,但没有区分| |具有更高的优先级和&&和| |具有同等的优先级。请记住,如果运算符的优先级相等,则只需从左到右对其求值。我应该说,这确实可以作为C#的证明,尤其是(或任何正常语言),因为您得到的实际结果是明确的。这并不是一种计算相对优先级的通用方法,以防你遇到一种故意与布尔代数相矛盾的深奥语言。在某些语言中,两者都没有(例如Smalltalk)。类比可能是骗人的。我不知道另一个被否决的选民,但我被否决了,因为这与问题无关。正好匹配。。。但任何人都可以设计一种语言,如果这不是真的;那么你的“逻辑证明”是如何工作的呢?这也许可以解释为什么选择了这个优先级,但这无助于确定我安装的编译器实际上是以这种方式运行的。@romkyns:这与语言有关。C和C++的规则源自代数定律。这就是为什么+的优先级小于*。你可以随心所欲地争辩,但你既错了又讨厌。您的编译器根据语言规范运行,语言规范以代数为基础,Q.E.D.QED?你知道证明某事意味着什么吗?这种语言可能是为了遵循代数定律,但是你如何证明,在这种意图和大量的工程努力之间,没有人在实现优先规则时搞砸、意外违反或误读规范?(不太可能,但并非不可能)我认为你的观点是正确的,只是它不符合“证明”的条件,证明比解释语言设计师决定如何以及为什么这样做要严格得多。“他们以代数为基础,因此它必然像代数一样工作”并不是一个严格的证明(实际上这样说在逻辑上是无效的)。为什么要混合布尔运算符和按位运算符?B你为什么坚持打印它?评估顺序与此有什么关系?响应对响应:|仍然是二进制的。
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