Lua运算符全集

       本节深度解析Lua 5.4的所有运算符特性,包含优先级规则、类型转换机制及在Android开发中的特殊应用场景。

1. 算术运算符

       Lua支持标准的数学运算,特别在Android开发中需注意数值类型转换。

运算符 描述 示例 Android注意事项
+ 加法 10 + 3 → 13 字符串会尝试自动转数字
- 减法/取负 10 - 3 → 7
-10 → -10
注意整数溢出问题
* 乘法 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不能转换)

2. 关系运算符

       用于比较两个值的运算符,返回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

3. 逻辑运算符

       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()

4. 位运算符(Lua 5.3+)

       针对整数的二进制位操作,在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

Android位运算实战

-- 检查权限标志
local PERM_READ = 1 << 0
local PERM_WRITE = 1 << 1
local userPerm = 3

if (userPerm & PERM_READ) ~= 0 then
    print("有读取权限")
end

5. 字符串运算符

       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 (字节数)

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)

Android开发特别提示

  1. 算术运算注意整数溢出问题
  2. 字符串连接优先使用table.concat
  3. 位运算比乘除法效率更高
  4. 复杂表达式适当添加括号明确意图
  5. 避免在UI线程进行密集运算