代码之家  ›  专栏  ›  技术社区  ›  Josiah Ruddell

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

  •  65
  • Josiah Ruddell  · 技术社区  · 16 年前

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

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

    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(| |)?如果你的答案是“没关系”,那么为什么在语言中它是这样构建的呢?

    6 回复  |  直到 16 年前
        1
  •  123
  •   Noctis    10 年前

    将第一个false改为true。我知道这样做似乎很愚蠢,但这证明了你的观点。

    bool result = true || true && false;   // --> true 
         result = (true || true) && false; // --> false
         result = true || (true && false); // --> true
    
        2
  •  13
  •   John Rasch    16 年前

    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#中, | 是执行与相同布尔逻辑的逻辑运算符 || 运算符的优先级高于两者 &&

    通过打印出这些值,您可以看到如果我使用 || True 将被打印-后面是表达式的结果 符合事实的 而且

    但是因为更高的优先级 | 这个 true | false true )及 结果是 && 充满 false 屈服 错误的 .

    我并不是想展示评估的顺序,只是事实上 | 在正常情况下不会的时间段内进行了评估:)

        3
  •  6
  •   Max Schmeling    16 年前

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

    bool result = true || false && false;
    
        4
  •  5
  •   EFraim    16 年前

    你不是用代码而是用逻辑来证明它。和是布尔乘法,而或是布尔加法。现在哪一个优先级更高?

        5
  •  2
  •   veggerby    16 年前

    假| |真&&符合事实的

    收益率:对

    假及&真的| |真的

    收益率:对

        6
  •  -5
  •   James    16 年前

    当布尔表达式短路时,不能仅显示最终结果。这里有一个片段可以解决你的问题。

    这有赖于实施,;和|由&&和| |,如中所述 MSDN 7.11 Conditional logical operators

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