布尔运算符优先级

Mik*_*ika 14 boolean operator-precedence operator-keyword

我想知道编程语言中的运算符优先级是否取决于实现,或者是否存在所有语言都遵循的固定规则.如果可能,您可以先订购具有最高优先级的以下运算符:AND,OR,NOT,XOR.

emi*_*jho 13

我用Google搜索,发现了这个它说,像APL和Smalltalk某些语言不具有运算符优先级规则,他们严格评估由左到右/左到右的表达式.

但是,在大多数语言中,优先遵循的相对优先顺序是NOT> XOR> AND> OR,尤其是那些从C派生的语言

  • 根据[this](http://en.cppreference.com/w/c/language/operator_precedence),C的优先级实际上是NOT> AND> XOR> OR,AND在XOR之前.JavaScript和Java也遵循此顺序. (2认同)

Iva*_*ang 6

您已经看到,当表达式将&&与||混合时 必须按正确的顺序进行评估。像算术一样,可以使用括号将操作数与正确的运算符分组。与算术运算符一样,逻辑运算符的优先级决定了在没有括号的情况下如何对事物进行分组。

在表达式中,优先级最高的运算符将首先与其操作数分组,然后第二高的运算符将与其操作数分组,依此类推。如果存在多个具有相同优先级的逻辑运算符,则会从左到右对其进行检查。

程序员通常使用括号将操作数分组在一起以提高可读性,即使仅使用运算符优先级也可以使用。

在此处输入图片说明

资源

一个简单的Java测试,它们是正确的:

@Test
public void booleanPrecedenceTest() {
    boolean A = true, B = false, C = true, D = false;
    Assert.assertTrue((A || B && C) == (A || (B && C)));
    Assert.assertTrue((A && B || C && D) == ((A && B) || (C && D)));
    Assert.assertTrue((A && B && C || D) == (((A && B) && C) || D));
    Assert.assertTrue((!A && B || C) == (((!A) && B) || C));
}
Run Code Online (Sandbox Code Playgroud)

  • 这里的前 3 个断言完全是多余的,并不能证明什么。如果“&&”和“||”的优先级相反,“==”左侧的表达式仍然计算出完全相同的值 (3认同)