操作顺序(==与非)

时间:2016-11-07 22:42:48

标签: lua language-design

有没有人知道为什么“boolean not”的优先级高于==大多数编程语言的操作顺序?

在数学逻辑/模型理论中,是不是相反?我最近在Lua写了以下内容:

if not 1 == 2 then
    print("hi")
end

由于not和==之间的操作顺序,它没有打印“hi”,这对我来说似乎很奇怪。

3 个答案:

答案 0 :(得分:5)

从来没有必要否定关系运算符,因为每个运算符都有一个相反的运算符。例如,我们有平等和不等运算符(你的例子可能是1 ~= 2)。大多数编程语言中的一元运算符具有最高优先级,因为大多数的时间导致代码更像自然语言。

例如,not green and not blue应该表示"既不是绿色也不是蓝色"。 not的优先级非常低会将其转换为类似not (green and not blue)的内容,这更难以理解。

答案 1 :(得分:1)

您需要区分not 1 == 2not (1 == 2)。后者表现得像你期望的那样;前者是仅应用于not的一元1,可能产生零。

这与数学/模型理论没有什么不同。

答案 2 :(得分:0)

编程中的clearTimeout(lastFadeInTimeout); 运算符在数学逻辑中有两个含义。第一个是域==的元素之间的相等性。第二个是双重含义=。这是因为您可以将数字与进行比较,就像您可以将布尔值与==进行比较一样。

在数学逻辑中,==只能比较域的值,因此=始终是布尔表达式,而a = ba则不是。但是,如果我们查看b,则a ↔ ba ↔ ba是布尔表达式。因此,b表示not a ↔ b(not a) ↔ b表示not a = b

但是,由于not (a = b)=在大多数编程语言中都由相同的运算符表示,因此对{实现不同的精度规则至少非常困难并且可能不直观{1}}使用时的方式不同。

难以实现的原因是因为通常在解析器中实现运算符优先级。当解析器将源代码翻译成语法树时,运算符优先级已经在树中编码。类型检查(如果有)与语法树一起使用。因此,解析器无法访问类型信息,这意味着它不能使用类型信息来应用不同的优先级规则。