【问题标题】:Boolean operators precedence布尔运算符优先级
【发布时间】:2012-09-11 18:05:05
【问题描述】:

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

【问题讨论】:

  • 我永远记不起 XOR 的优先级,但我使用的所有语言对其他三种语言都有相同的优先级。

标签: boolean operator-keyword operator-precedence


【解决方案1】:

我在 Google 上搜索并发现 this 表示某些语言(如 APL 和 SmallTalk)没有运算符优先规则,它们严格地从左到右/从左到右评估表达式。

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

【讨论】:

  • 根据this,C 的优先级实际上是 NOT > AND > XOR > OR,AND 在 XOR 之前。 JavaScript 和 Java 也遵循这个顺序。
  • @mbomb007 这是按位与而不是逻辑与
  • @AndrewNaguib 阅读我发布的链接。在 C 中按位 AND 位于按位 XOR 之前。
  • 是的,他指的不是按位与,而是指逻辑与。
  • C/C++ 没有逻辑异或,只有按位异或。我所知道的实际上没有一种语言具有逻辑 XOR。 XOR 在进行按位运算时很有意义,但是对于布尔运算,您可以使用 AND 和 OR 的组合或其他更高级别的语言结构来解决它。
【解决方案2】:

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

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

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

Source

【讨论】:

  • 这里的前 3 个断言完全是多余的,并且什么也证明不了。如果&& 和|| 的优先级相反,== 左侧的表达式仍会计算出完全相同的值
【解决方案3】:

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

【讨论】:

  • 好的。发布时我想到了布尔运算符。感谢您提醒我按位运算符。
【解决方案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 ((true xor false) or true),而不是 false (true xor (false or true))
  • 是的。原因与算术运算符非常相似。这是一个“不同的代数”(布尔代数)。 AND 是一种乘法,OR 类似于加法。在某些领域,它比标准代数更重要(例如数字电路的构造)。
  • 您也可以将布尔 XOR 缩写为 A != B。但是随后您将进入比较运算符与布尔运算符的优先顺序。所以要小心。
【解决方案5】:

证明 AND 的优先级高于 OR 的明显且简单的方法是比较带括号和不带括号的语句的结果:

std::cout << std::boolalpha;
std::cout << ( true || false && false )     << std::endl;   // gives true
std::cout << ( ( true || false ) && false ) << std::endl;   // gives false

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-06-21
    相关资源
    最近更新 更多