运算顺序 (== vs. not)

有人知道为什么大多数编程语言中 "布尔非" 在运算顺序中比 == 优先级高吗?

在数理逻辑/模型理论中,不是反过来吗?我最近在 Lua 中写了以下代码:

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

它没有打印 "hi",因为 not 和 == 之间的运算顺序对我来说看起来很奇怪。

点赞
用户207421
用户207421

你需要区分 not 1 == 2not (1 == 2)。后者的行为与你预期的相同;前者是一个应用在1上的一元 not 运算符,可能会产生零。

这与“数学/模型理论”没有区别。

2016-11-07 23:28:39
用户501459
用户501459

将下面翻译成中文并且保留原本的 markdown 格式

在关系运算符中,通常不需要否定一个关系运算符,因为每个关系运算符都有相反的运算符。例如,我们有等式和不等式运算符(您的示例可以写成 1 ~= 2)。

大多数编程语言中,一元运算符具有最高的优先级,因为这通常会产生更接近自然语言的代码。

例如,not green and not blue 应该表示 "既不是绿色也不是蓝色"。如果 not 的优先级非常低,那么它就会变成类似于 not (green and not blue),这就难以理解了。

2016-11-08 07:45:30
用户3888450
用户3888450

在编程中,== 运算符在数理逻辑中有两个含义。第一个是域内元素的相等 =。第二个是双蕴涵 ↔。这是因为你可以用 == 运算符比较数字,就像你可以用 == 比较布尔值一样。

在数理逻辑中,= 只能比较域的值,所以 a = b 总是布尔表达式,而 ab 不是。然而,如果我们看 a ↔ b,那么 a ↔ bab 都是布尔表达式。因此,not a ↔ b 意味着 (not a) ↔ b,而 not a = b 意味着 not (a = b)

然而,由于=↔ 在大多数编程语言中都用同一个运算符 == 表示,因此在不同情况下使用 == 实现不同的精度规则至少是非常困难的,可能不直观。

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

2016-11-13 14:28:29