有没有人知道为什么“boolean not”的优先级高于==
大多数编程语言的操作顺序?
在数学逻辑/模型理论中,是不是相反?我最近在Lua写了以下内容:
if not 1 == 2 then
print("hi")
end
由于not和==
之间的操作顺序,它没有打印“hi”,这对我来说似乎很奇怪。
答案 0 :(得分:5)
从来没有必要否定关系运算符,因为每个运算符都有一个相反的运算符。例如,我们有平等和不等运算符(你的例子可能是1 ~= 2
)。大多数编程语言中的一元运算符具有最高优先级,因为大多数的时间导致代码更像自然语言。
例如,not green and not blue
应该表示"既不是绿色也不是蓝色"。 not
的优先级非常低会将其转换为类似not (green and not blue)
的内容,这更难以理解。
答案 1 :(得分:1)
您需要区分not 1 == 2
和not (1 == 2)
。后者表现得像你期望的那样;前者是仅应用于not
的一元1
,可能产生零。
这与数学/模型理论没有什么不同。
答案 2 :(得分:0)
编程中的clearTimeout(lastFadeInTimeout);
运算符在数学逻辑中有两个含义。第一个是域==
的元素之间的相等性。第二个是双重含义=
。这是因为您可以将数字与↔
进行比较,就像您可以将布尔值与==
进行比较一样。
在数学逻辑中,==
只能比较域的值,因此=
始终是布尔表达式,而a = b
和a
则不是。但是,如果我们查看b
,则a ↔ b
,a ↔ b
和a
是布尔表达式。因此,b
表示not a ↔ b
,(not a) ↔ b
表示not a = b
。
但是,由于not (a = b)
和=
在大多数编程语言中都由相同的运算符↔
表示,因此对{实现不同的精度规则至少非常困难并且可能不直观{1}}使用时的方式不同。
难以实现的原因是因为通常在解析器中实现运算符优先级。当解析器将源代码翻译成语法树时,运算符优先级已经在树中编码。类型检查(如果有)与语法树一起使用。因此,解析器无法访问类型信息,这意味着它不能使用类型信息来应用不同的优先级规则。