【问题标题】:Standard boolean order of operation标准布尔运算顺序
【发布时间】:2013-12-07 12:03:10
【问题描述】:

我正在用 Javascript 编写一个用于布尔逻辑的调车场算法,但我遇到了操作顺序的障碍。我允许的操作是:

and, or, implies, equals(biconditional), not, xor, nor, nand

但是,我不知道这些的优先级是什么。到目前为止,我有:

not>equals>implies>xor>nor>nand>or>and

这是正确的吗?有没有我可以使用的标准,类似于 PEMDAS/BODMAS 系统的数字?

【问题讨论】:

  • 通过 Coq 证明助手,不 > 等于 > xor > and > and > or > 暗示
  • C 标准使用 NOT > EQUALS > AND > XOR > OR。为了使优先级解析工作,一元运算符应该比所有二元运算符具有更高的优先级。 AND 通常被认为比 OR 绑定更紧密,允许以没有括号的规范析取形式实现表达式:( A && B || C && D )
  • 既然你喜欢Shunting Yard算法,你可能也会喜欢precedence climbing

标签: javascript boolean logic operator-precedence


【解决方案1】:

您很难找到这些 JavaScript 运算符的优先级定义的原因是:

  1. 只有在使用中缀表示法时,优先级才会起作用。既然你提到了调车场算法,我认为你打算使用中缀表示法。
  2. 每种语言都可以定义自己的优先级,并且由于您正在创建 DSL,因此您创建了优先级,但它必须保持一致。
  3. 这些名称实际上是前缀函数名称,中缀在运算符符号中比名称更常见。您应该使用运算符而不是函数名称:

    和&
    或 |
    暗示 →
    等于(双条件)↔
    不是!
    异或⊕
    也不是 ⊽
    南德⊼

  4. 在解析时,您将中缀转换为前缀或后缀,因此如果您正在构建诸如 AST 之类的中间形式,则运算符符号应更改为函数名称。
  5. 你没有提到associativity,你不需要。
正如这两个受人尊敬的来源之间的差异所指出的那样,似乎没有标准。

来自 Jeffrey D. Ullman 的 "Foundations of Computer Science"

逻辑运算符的关联性和优先级

我们将使用的优先顺序是
1. 不是(最高)
2. NAND
3. NOR
4. 与
5. 或
6. 暗示 7. BICONDITIONAL(最低)

来自Mathematica



NAND
异或

NOR
等效
暗示

【讨论】:

    【解决方案2】:

    似乎没有标准。

    我有一本书 (Digital design by Morris Mano),上面写着 NOT>AND>OR。这是公认的观点。

    关于其余的,我发现的意见很少。 This guy 认为 EQUIV 是最低的 (Wikipedia assist)。但是this guy 认为EQUIV 在中间XOR>EQUIV>OR(参考文献很少)。

    另一个分歧是关于XOR的地方。这里this third guy同意第二个人:)

    简而言之,两种意见:

    1)NOT>AND>NAND>XOR>EQUIV>OR>NOR(忽略NOR

    2) NOT>AND>NAND>NOR>OR>IMPLIES>XOR>EQUIV

    注意:只有NOT>AND>OR 部分经过学术认证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2013-06-13
      • 2011-01-14
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2020-08-22
      相关资源
      最近更新 更多