标准布尔运算顺序

Posted

技术标签:

【中文标题】标准布尔运算顺序【英文标题】: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。 【参考方案1】:

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

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

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

    在解析时,您将中缀转换为前缀或后缀,因此如果您正在构建诸如 AST 之类的中间形式,则运算符符号应更改为函数名称。 你没有提到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 部分经过学术认证。

【讨论】:

以上是关于标准布尔运算顺序的主要内容,如果未能解决你的问题,请参考以下文章

R语言比较运算符和逻辑运算符顺序

评估布尔语句的顺序是啥? [复制]

VB运算符在运算式的顺序是啥?

短路评估顺序和前缀增量运算符

带括号的逻辑运算的优先顺序(Java)[重复]

运算符