Lua 运算符
Lua - 运算符
Section titled “Lua - 运算符”运算符(Operator)是指导 Lua 解释器执行特定数学、关系或逻辑操作的符号。Lua 提供了丰富的内置运算符集,可分为以下几类:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 杂项运算符(连接、长度)
本教程将通过示例解释每种类型的运算符。
下表列出了 Lua 支持的算术运算符。假设 local a = 10 和 local b = 20:
示例代码:
local a = 10local b = 20
print("a + b = ", a + b) -- 输出:30print("a - b = ", a - b) -- 输出:-10print("a * b = ", a * b) -- 输出:200print("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 = 10local b = 20
print("a == b is", a == b) -- 输出: a == b 是 falseprint("a ~= b is", a ~= b) -- 输出: a ~= b 是 trueprint("a > b is", a > b) -- 输出: a > b 是 falseprint("a < b is", a < b) -- 输出: a < b 是 trueprint("a >= b is", a >= b) -- 输出: a >= b 是 falseprint("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 = truelocal 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 = #messageprint("Length of message:", str_len) -- 输出: 消息长度: 12
local my_array = {10, 20, 30}local arr_len = #my_arrayprint("Length of array:", arr_len) -- 输出: 数组长度: 3| 运算符 | 描述 | 示例 |
|---|---|---|
| .. | 连接:连接两个字符串。 | "Hello " .. "World" 的结果是 "Hello World"。 |
| # | 长度运算符(一元):返回字符串的长度(以字节为单位)或序列表的长度(从索引 1 开始到第一个 nil 值之间的元素数量)。 | #"Hello" 的结果是 5。 #{1,2,3} 的结果是 3。 |
Lua 中的运算符优先级
Section titled “Lua 中的运算符优先级”运算符优先级(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 参考手册。