标准布尔运算顺序
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
部分经过学术认证。
【讨论】:
以上是关于标准布尔运算顺序的主要内容,如果未能解决你的问题,请参考以下文章