Skip to content

Lua 运算符

运算符(Operator)是指导 Lua 解释器执行特定数学、关系或逻辑操作的符号。Lua 提供了丰富的内置运算符集,可分为以下几类:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 杂项运算符(连接、长度)

本教程将通过示例解释每种类型的运算符。

下表列出了 Lua 支持的算术运算符。假设 local a = 10 和 local b = 20:

示例代码:

local a = 10
local b = 20
print("a + b = ", a + b) -- 输出:30
print("a - b = ", a - b) -- 输出:-10
print("a * b = ", a * b) -- 输出:200
print("b / a = ", b / a) -- 输出:2.0(浮点除法)
print("b % a = ", b % a) -- 输出:0(除法余数)
print("a ^ 2 = ", a ^ 2) -- 输出:100(幂运算)
print("-a = ", -a) -- 输出:-10(一元负号,取反)
-- Lua 5.3+ 还引入了整除 //
-- print("7 // 2 = ", 7 // 2) -- 输出:3(如果使用 Lua 5.3+)
运算符描述示例 (a=10, b=20)
+加法:将两个操作数相加。a + b 的结果是 30
-减法:从第一个操作数中减去第二个操作数。a - b 的结果是 -10
*乘法:将两个操作数相乘。a * b 的结果是 200
/除法:用被除数除以除数。结果总是浮点数。b / a 的结果是 2.0
%取模:整数除法的余数。b % a 的结果是 0
^幂运算:将第一个操作数提升到第二个操作数的幂次方。a ^ 2 的结果是 100
-一元负号:对其操作数取反。-a 的结果是 -10

关系运算符(Relational Operator)比较两个值并返回布尔(Boolean)结果(true 或 false)。假设 local a = 10 和 local b = 20:

示例代码:

local a = 10
local b = 20
print("a == b is", a == b) -- 输出: a == b 是 false
print("a ~= b is", a ~= b) -- 输出: a ~= b 是 true
print("a > b is", a > b) -- 输出: a > b 是 false
print("a < b is", a < b) -- 输出: a < b 是 true
print("a >= b is", a >= b) -- 输出: a >= b 是 false
print("a <= b is", a <= b) -- 输出: a <= b 是 true
运算符描述示例 (a=10, b=20)
==相等:检查两个操作数的值是否相等。(a == b) 是 false。
~=不等:检查两个操作数的值是否不相等。(a ~= b) 是 true。
>大于:检查左操作数的值是否大于右操作数的值。(a > b) 是 false。
<小于:检查左操作数的值是否小于右操作数的值。(a < b) 是 true。
>=大于等于:检查左操作数的值是否大于或等于右操作数的值。(a >= b) 是 false。
<=小于等于:检查左操作数的值是否小于或等于右操作数的值。(a <= b) 是 true。

逻辑运算符(Logical Operator)用于组合或修改布尔表达式。在 Lua 中,false 和 nil 被认为是“假值”(falsy),而所有其他值都被认为是“真值”(truthy)。逻辑运算符 and 和 or 表现出“短路”(short-circuiting)行为,并返回其中一个操作数,而不一定是布尔值。

假设 local x = true、local y = false、local name = "Lua"、local version = nil:

示例代码:

local x = true
local y = false
print("x and y is", x and y) -- 输出: x and y 是 false (返回 y)
print("x or y is", x or y) -- 输出: x or y 是 true (返回 x)
print("not x is", not x) -- 输出: not x 是 false
local name = "Lua"
local version = nil
-- 短路行为:
-- 'and' 如果第一个操作数是假值(false 或 nil),则返回它。否则,返回第二个操作数。
print("version and name:", version and name) -- 输出: version and name: nil (version 是 nil)
print("name and version:", name and version) -- 输出: name and version: nil (version 是 nil,name 是真值)
print("name and 'Rocks!':", name and "Rocks!") -- 输出: name and 'Rocks!': Rocks!
-- 'or' 如果第一个操作数是真值(非 false 且非 nil),则返回它。否则,返回第二个操作数。
print("version or '5.4':", version or "5.4") -- 输出: version or '5.4': 5.4 (version 是 nil)
print("name or 'Default':", name or "Default") -- 输出: name or 'Default': Lua (name 是真值)
运算符描述示例 (x=true, y=false)
and逻辑与:如果第一个操作数是假值(false 或 nil),则返回它。否则,返回第二个操作数。(x and y) 的结果是 false (y 的值)。
or逻辑或:如果第一个操作数是真值(非 false 且非 nil),则返回它。否则,返回第二个操作数。(x or y) 的结果是 true (x 的值)。
not逻辑非:反转其操作数的逻辑状态。如果操作数是假值,则返回 true;如果是真值,则返回 false。not x 的结果是 false。

Lua 包含用于字符串连接(string concatenation)以及确定字符串或类似序列的表(table)长度的运算符。

示例代码:

local greeting = "Hello"
local target = "World"
local message = greeting .. " " .. target .. "!" -- 连接
print(message) -- 输出: Hello World!
local str_len = #message
print("Length of message:", str_len) -- 输出: 消息长度: 12
local my_array = {10, 20, 30}
local arr_len = #my_array
print("Length of array:", arr_len) -- 输出: 数组长度: 3
运算符描述示例
..连接:连接两个字符串。"Hello " .. "World" 的结果是 "Hello World"。
#长度运算符(一元):返回字符串的长度(以字节为单位)或序列表的长度(从索引 1 开始到第一个 nil 值之间的元素数量)。#"Hello" 的结果是 5。 #{1,2,3} 的结果是 3。

运算符优先级(Operator Precedence)定义了表达式中操作执行的顺序。优先级较高的运算符在优先级较低的运算符之前被评估。例如,在 x = 7 + 3 * 2 中,乘法 (*) 的优先级高于加法 (+),因此 3 * 2 先被评估 (6),然后 7 + 6 (13)。

下表列出了从最高到最低优先级的运算符。大多数二元运算符是左结合(left-associative)的,但幂运算 (^) 和连接 (..) 是右结合(right-associative)的。一元运算符 (not、#、一元 -) 也是右结合的。

优先级运算符结合性
最高^从右到左
not # - (一元)从右到左
* / %从左到右
+ - (二元)从左到右
..从右到左
< > <= >= ~= ==从左到右(注意:不像 a < b < c 那样可链式使用)
and从左到右
最低or从左到右

您可以使用括号 () 来覆盖默认的优先级,并强制表达式的某些部分按特定顺序进行评估。

更多资源:要全面了解 Lua 运算符及其细节,请查阅官方的 Lua 参考手册。