混合逻辑和关系运算符的评估顺序?

时间:2014-06-26 17:10:10

标签: lua operator-precedence

Lua将这个表达不佳的表达解释为什么?

return 1 or 2 == 3 and 4 - > 1

当然不是从左到右踩过每个操作员:

return (1 or 2) == 3 and 4 - >假

是否正在反向评估?

1 个答案:

答案 0 :(得分:5)

您可能习惯于具有不同优先级的算术运算符。例如,如果我们写1 + 2 * 3,则假设乘法在1 + (2 * 3)之前添加,而不是像(1 + 2) * 3那样从左到右进行评估。这些标准数学优先级用于大多数编程语言。我能想到的唯一值得注意的反例是Smalltalk,它始终评估从左到右和语言,迫使你明确优先级(LISP和Forth)。

对于关系运算符和布尔运算符,编程语言习惯于扩展传统的算术优先级以覆盖语言中的所有运算符。 Lua的完整优先级表可以在这里找到:

http://www.lua.org/manual/5.2/manual.html#3.4.7

 or
 and
 <     >     <=    >=    ~=    ==
 ..
 +     -
 *     /     %
 not   #     - (unary)
 ^

布尔值andor运算符的优先级最低,因此1 or 2 == 3 and 4将被解析为1 or ((2 == 3) and 4)