布尔运算符优先级

28
我想知道编程语言中的操作符优先级是否取决于实现,或者是否有一个固定的规则所有语言都遵循。如果可能的话,请按照最高优先级先排序以下运算符:AND、OR、NOT、XOR。

我想知道编程语言中的操作符优先级是否取决于实现,或者是否有一个固定的规则所有语言都遵循。

如果可能的话,请按照最高优先级先排序以下运算符:AND、OR、NOT、XOR。


1
我总是记不住异或运算的优先级,但我使用过的所有语言对于其他三个运算符都有相同的优先级。 - Neil
6个回答

24

我搜索并发现这个,它说一些像APL和SmallTalk这样的语言没有运算符优先级规则,严格从左到右/从左到右评估表达式。

然而,在大多数语言中,特别是那些派生自C的语言中,所遵循的相对优先顺序为NOT>XOR>AND>OR。


4
根据这里的说明,C语言的优先级实际上不是 > AND > XOR > OR,而是AND在XOR之前。JavaScript和Java也遵循这个顺序。 - mbomb007
@AndrewNaguib 请阅读我发布的链接。在C语言中,按位与运算比按位异或运算先执行。 - mbomb007
C/C++ 没有逻辑异或,只有位运算异或。实际上,我所知道的语言都没有逻辑异或。当进行位运算时,异或非常有意义,但是对于布尔运算,您可以使用AND和OR的组合,或其他更高级别的语言结构来解决它。 - Petruza
如果您不想使用 ^ 作为逻辑异或运算符,您可以使用 != ,它将计算结果与 XOR 相同。 - Jesse Chisholm
Java也有^ XOR。 - cquezel
显示剩余3条评论

17

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

在表达式中,具有最高优先级的运算符首先与其操作数相组合,然后下一个优先级较高的运算符将与其操作数相组合,以此类推。如果存在几个具有相同优先级的逻辑运算符,则将从左到右检查它们。

程序员通常会使用括号将操作数分组以提高可读性,即使仅仅使用运算符优先级也可以实现相同的效果。

输入图像描述

来源


3
这里的前三个断言完全是多余的,证明不了任何东西。如果“&&”和“||”的优先级相反,== 左侧的表达式仍将计算出完全相同的值。 - jaro2gw

4
有三种基本的布尔运算符:NOT、AND、OR。XOR只是A AND NOT B OR NOT A AND B或者(A OR NOT B) AND (NOT A OR B)的简化版本。因此,只有这三个有常见的优先级:NOT > AND > OR。XOR在不同的语言中位置不同,但它肯定不比AND优先级高,也不比OR低。大多数语言(如C/C++/Javascript等)将它放置在AND和OR之间,但在其他语言(如Perl)中,XOR和OR具有相同的优先级。
(OR可以仅使用AND和NOT表示,但它仍然是一个基本运算符:A OR B = NOT(NOT A AND NOT B)

有没有好的理由来区分不同的优先级?我认为(在理想的情况下),布尔运算符应该具有相同的优先级,并且逻辑操作应始终从左到右执行。有没有其他好的理由呢?true xor false or true 应该被评估为真 ((true xor false) or true),而不是假 (true xor (false or true))。 - Junior
是的。原因与算术运算符非常相似。这是一种“不同的代数”(布尔代数)。AND是一种乘法,OR就像加法一样。在某些领域中,它比标准代数更重要(例如数字电路的构建)。 - FERcsI
你也可以将布尔异或缩写为A != B。但是这样会涉及到比较运算符和布尔运算符的优先级顺序,所以要小心。 - Jesse Chisholm

4

布尔运算还是按位运算?没有固定的规则,大多数语言都有类似的规则,但细节上有所不同。在语言定义中查找。


好的。我在发布时想到了布尔运算符。谢谢你提醒我位运算符。 - Mika

1
在传统的布尔代数中,优先级是not > and > or,如果你将not写成一个上横线。 and是"乘法",or是"加法"。作为运算符的not的情况则不太清楚。在我看来,xor应该被赋予与包含性or相同的优先级。
在C/C++中,! > != > && > ||(没有逻辑运算符^!=充当xor)。
在C#中,! > & > ^ > |
在Visual Basic中,Not > And > Or > Xor
在FORTRAN中,.not. > /= > .and. > .or.(没有.xor./=充当xor)。
在Python中,!= > not > and > or(没有xor!=充当xor)。
在Pascal中,not > and > or > <>(没有xor<>充当xor)。

1
明显而简单的证明 AND 操作符比 OR 操作符优先级更高的方法是比较有括号和无括号语句的结果。
std::cout << std::boolalpha;
std::cout << ( true || false && false )     << std::endl;   // gives true
std::cout << ( ( true || false ) && false ) << std::endl;   // gives false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接