标准布尔运算顺序



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

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

然而,我不知道这些优先顺序是什么。截至目前,我有:

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

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

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

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

    和&
    或|
    暗示→
    等于(双条件)↔
    不是
    xorŞ
    nor⊽
    nand⊼

  4. 解析时,您将中缀转换为前缀或后缀,因此如果您正在构建一个中间形式(如AST),则运算符符号应更改为函数名
  5. 你没有提到关联性,这是NOT所需要的
这两个值得尊敬的消息来源之间的差异似乎没有任何标准。

摘自Jeffrey D.Ullman 的"计算机科学基础"

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

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

来自Mathematica

NOT

NAND
XOR

NOR
等效
实现

似乎没有标准。

我有一本书(Morris Mano的数字设计)说NOT>AND>OR。这是一个公认的观点。

关于其他的,我几乎没有发现什么意见。这家伙认为EQUIV是最低的(维基百科辅助)。但这家伙认为CCD_ 3在CCD_ 4的中间(参考文献很少)。

另一个分歧是关于XOR的位置。第三个人同意第二个人的观点:)

简而言之,有两种观点:

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

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

注:只有NOT>AND>OR部分获得学术认证。

最新更新