我想知道编程语言中的运算符优先级是否取决于实现,或者是否存在所有语言都遵循的固定规则。如果可能的话,您能否将以下运算符按最高优先级排序:AND、OR、NOT、XOR。
5 回答
我用谷歌搜索并发现这表明某些语言(如 APL 和 SmallTalk)没有运算符优先规则,它们严格地从左到右/从左到右评估表达式。
但是,在大多数语言中,尤其是从 C 派生的语言中,遵循的相对优先顺序是 NOT > XOR > AND > OR
您已经看到,当表达式将 && 与 || 混合时 评估必须以正确的顺序进行。括号可用于将操作数与其正确的运算符分组,就像在算术中一样。与算术运算符一样,逻辑运算符具有确定在没有括号的情况下如何分组的优先级。
在表达式中,优先级最高的运算符首先与其操作数分组,然后下一个最高优先级的运算符将与其操作数分组,依此类推。如果有多个具有相同优先级的逻辑运算符,则从左到右检查它们。
程序员通常使用括号将操作数组合在一起以提高可读性,即使单独使用运算符优先级也是如此。
布尔还是按位?没有固定的规则,大多数语言都有类似的规则,但细节不同。在语言定义中查找。
有三个基本的布尔运算符:NOT、AND、OR。XOR 只是A AND NOT B OR NOT A AND B
or的一个简单版本(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)
:)
证明 AND 的优先级高于 OR 的明显且简单的方法是比较带括号和不带括号的语句的结果:
std::cout << std::boolalpha;
std::cout << ( true || false && false ) << std::endl; // gives true
std::cout << ( ( true || false ) && false ) << std::endl; // gives false