本节深度解析Lua 5.4的所有运算符特性,包含优先级规则、类型转换机制及在Android开发中的特殊应用场景。
Lua支持标准的数学运算,特别在Android开发中需注意数值类型转换。
运算符 | 描述 | 示例 | Android注意事项 |
---|---|---|---|
+ | 加法 | 10 + 3 → 13 |
字符串会尝试自动转数字 |
- | 减法/取负 | 10 - 3 → 7 |
注意整数溢出问题 |
* | 乘法 | 10 * 3 → 30 |
大数计算可能丢失精度 |
/ | 除法 | 10 / 3 → 3.333... |
结果总是浮点数 |
// | 整除 | 10 // 3 → 3 |
Lua 5.3+特性 |
% | 取模 | 10 % 3 → 1 |
支持浮点数取模 |
^ | 幂运算 | 2 ^ 10 → 1024 |
结果总是浮点数 |
print("10" + 2) -- 12 (字符串转数字)
print(10 + true) -- 报错 (boolean不能转换)
print(10 + nil) -- 报错 (nil不能转换)
用于比较两个值的运算符,返回boolean结果,在Android UI逻辑中广泛应用。
运算符 | 描述 | 示例 | 特殊规则 |
---|---|---|---|
== | 等于 | 3 == 3.0 → true |
类型不同直接返回false |
~= | 不等于 | 3 ~= 4 → true |
等价于 not (a == b) |
< | 小于 | "a" < "b" → true |
字符串按字典序比较 |
> | 大于 | 10 > 5 → true |
- |
<= | 小于等于 | 3 <= 3 → true |
- | >= | 大于等于 | 5 >= 5 → true |
- |
local t1 = {1, 2, 3}
local t2 = {1, 2, 3}
print(t1 == t2) -- false (比较引用)
print(rawequal(t1, t2)) -- false
Lua的逻辑运算符具有短路特性,是控制流程的重要工具。
运算符 | 描述 | 示例 | 返回值规则 |
---|---|---|---|
and | 逻辑与 | a and b |
a为假时返回a,否则返回b |
or | 逻辑或 | a or b |
a为真时返回a,否则返回b |
not | 逻辑非 | not a |
总是返回boolean |
-- 安全访问嵌套字段
local value = table and table.field or defaultValue
-- 默认值设置
local level = userLevel or 1 -- userLevel为nil时返回1
-- 条件初始化
local logger = logger or LogFactory.getLogger()
针对整数的二进制位操作,在Android性能敏感代码中常用。
运算符 | 描述 | 示例 | 二进制演示 |
---|---|---|---|
& | 按位与 | 5 & 3 → 1 |
101 & 011 → 001 |
| | 按位或 | 5 | 3 → 7 |
101 | 011 → 111 |
~ | 按位异或 | 5 ~ 3 → 6 |
101 ~ 011 → 110 |
>> | 右移 | 8 >> 1 → 4 |
1000 → 0100 |
<< | 左移 | 1 << 3 → 8 |
0001 → 1000 |
~ | 按位取反 | ~0 → -1 |
00...0 → 11...1 |
-- 检查权限标志
local PERM_READ = 1 << 0
local PERM_WRITE = 1 << 1
local userPerm = 3
if (userPerm & PERM_READ) ~= 0 then
print("有读取权限")
end
Lua提供专门的字符串连接运算符,在Android UI构建中频繁使用。
local name = "张" .. "三" -- "张三"
local path = "/sdcard/" .. fileName
-- 性能优化(避免循环连接)
local parts = {"姓名:", name, ", 年龄:", age}
local info = table.concat(parts) -- 高效连接
local str = "Android"
print(#str) -- 7 (字节数)
-- UTF-8字符串需特殊处理
local chinese = "中文"
print(utf8.len(chinese)) -- 2 (字符数)
print(#chinese) -- 6 (字节数)
理解优先级是编写正确表达式的关键,Android复杂逻辑中尤为重要。
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ^ | 右 |
2 | not # - (unary) | 右 |
3 | * / // % | 左 |
4 | + - | 左 |
5 | .. | 右 |
6 | < > <= >= ~= == | 左 |
7 | and | 左 |
8 | or | 左 |
local result = 10 + 2 * 3 ^ 2 -- 等价于 10 + (2 * (3^2)) → 28
local flag = a > 0 and b < 0 or c == 1 -- 等价于 (a>0 and b<0) or (c==1)