逻辑和关系运算符混合时的求值顺序?

Lua是如何将这个格式不良的表达式解释为什么的?

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

它肯定不是从左到右遍历每个运算符:

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

是在进行反向评估吗?

点赞
用户90511
用户90511

你可能已经习惯了算术运算符有不同的优先级。例如,如果我们写 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   #     -(一元)
 ^

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

2014-06-26 17:15:14