【发布时间】:2012-09-11 18:05:05
【问题描述】:
我想知道编程语言中的运算符优先级是否取决于实现,或者是否存在所有语言都遵循的固定规则。如果可能的话,您能否将以下运算符按最高优先级排序:AND、OR、NOT、XOR。
【问题讨论】:
-
我永远记不起 XOR 的优先级,但我使用的所有语言对其他三种语言都有相同的优先级。
标签: boolean operator-keyword operator-precedence
我想知道编程语言中的运算符优先级是否取决于实现,或者是否存在所有语言都遵循的固定规则。如果可能的话,您能否将以下运算符按最高优先级排序:AND、OR、NOT、XOR。
【问题讨论】:
标签: boolean operator-keyword operator-precedence
我在 Google 上搜索并发现 this 表示某些语言(如 APL 和 SmallTalk)没有运算符优先规则,它们严格地从左到右/从左到右评估表达式。
但是,在大多数语言中,尤其是从 C 派生的语言中,相对优先顺序是 NOT > XOR > AND > OR
【讨论】:
您已经看到,当表达式将 && 与 || 混合时评估必须以正确的顺序进行。括号可用于将操作数与其正确的运算符分组,就像在算术中一样。与算术运算符一样,逻辑运算符具有确定在没有括号的情况下如何对事物进行分组的优先级。
在表达式中,优先级最高的运算符首先与其操作数分组,然后下一个最高优先级的运算符将与其操作数分组,依此类推。如果有多个具有相同优先级的逻辑运算符,则从左到右检查它们。
即使单独使用运算符优先级,程序员也经常使用括号将操作数组合在一起以提高可读性。
【讨论】:
&& 和|| 的优先级相反,== 左侧的表达式仍会计算出完全相同的值
布尔还是按位?没有固定的规则,大多数语言都有类似的规则,但细节不同。在语言定义中查找。
【讨论】:
有三种基本的布尔运算符: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 ((true xor false) or true),而不是 false (true xor (false or true))
A != B。但是随后您将进入比较运算符与布尔运算符的优先顺序。所以要小心。
证明 AND 的优先级高于 OR 的明显且简单的方法是比较带括号和不带括号的语句的结果:
std::cout << std::boolalpha;
std::cout << ( true || false && false ) << std::endl; // gives true
std::cout << ( ( true || false ) && false ) << std::endl; // gives false
【讨论】: