使用布尔代数(不是特定的语言实现),我们可以明确地评估1 ^ 1 + 1
(或1 XOR 1 OR 1
)吗?
我可以推导出两个评估:
[I]: (1 ^ 1) + 1 = 0 + 1 = 1
[II]: 1 ^ (1 + 1) = 1 ^ 1 = 0
也许有一些陈述的操作顺序,或者从左到右的评估?或者这不是在布尔代数中定义的吗?
答案 0 :(得分:3)
我们可以使用the rules of boolean algebra来尝试评估表达式1 XOR 1 OR 1
。
现在:
XOR
源自OR
,A XOR B = (¬A AND B) OR (¬B AND A)
; A OR (B OR C) = (A OR B) OR C
; A AND (B AND C) = (A AND B) AND C
因此,采用评估顺序的任何可能解释:
(1 XOR 1) OR 1 1 XOR (1 OR 1)
即使我们没有定义从左到右的“评估顺序”,但我们需要这些规则来表明两种可能的解释不等价:
= (¬1 AND 1) OR (¬1 AND 1) OR 1 = (¬1 AND (1 OR 1)) OR (¬(1 OR 1) AND 1)
= (0 AND 1) OR (0 AND 1) OR 1 = (0 AND 1) OR (0 AND 1)
= 0 OR 0 OR 1 = 0 OR 0
= 1 = 0
除非我忘记了一些至关重要的公理,否则我已经确认你需要更多的上下文来评估给定的表达式。
(当然,检查表达式A XOR B OR C
∀A
,B
,C
当然要复杂得多!但如果表达式是对于所有三个输入中只有一个值是模糊的,那么为什么还要检查其他任何一个?)
此上下文通常在特定于语言的评估顺序规则中提供。 C型语言give XOR
a low precedence(Richie不喜欢的东西);相比之下,数学惯例dictates a left-to-right associativity,其中不能应用其他公理,否则会出现歧义。
所以,基本上,由于我们忽略了特定于语言的规则,你可能会选择[I]
。
答案 1 :(得分:1)
大多数语言都会进行XOR,然后是OR;经验丰富的编码员无论如何都要用括号来表达意图。
更多现代语言执行所谓的快速或短路评估,因此0 & ?
始终为0
,因此不会评估?
;与1 + ?
相同。
答案 2 :(得分:0)
我认为逻辑运算符没有普遍认同的优先顺序。评估完全针对某种语言。
答案 3 :(得分:-1)
例如,在c#中,按位运算符的Operator precedence为:
但这可能与另一种语言不同。如果优先级相同,则操作从左到右执行。没有逻辑XOR运算符,但您可以使用NOT EQUAL(!=)。