4.1 算术运算符
| 运算符 |
含义 |
示例 |
结果 |
+ |
加法 |
10 + 3 |
13 |
- |
减法 |
10 - 3 |
7 |
* |
乘法 |
10 * 3 |
30 |
/ |
除法 |
10 / 3 |
3.3333 |
// |
整除(5.3+) |
10 // 3 |
3 |
% |
取模 |
10 % 3 |
1 |
^ |
幂运算 |
2 ^ 10 |
1024 |
- |
负号 |
-5 |
-5 |
除法与整除
1 2 3 4 5 6 7 8 9 10 11 12 13
| print(10 / 3) print(10 / 2)
print(10 // 3) print(-10 // 3) print(10 // -3) print(-10 // -3)
|
取模运算
取模运算满足公式:a % b == a - ((a // b) * b)
1 2 3 4 5 6 7 8 9 10 11 12
| print(10 % 3) print(-10 % 3) print(10 % -3) print(-10 % -3)
local function is_even(n) return n % 2 == 0 end
local hour = (current_hour % 12)
|
幂运算
1 2 3 4
| print(2 ^ 3) print(2 ^ 0.5) print(10 ^ -2) print(16 ^ (1/4))
|
浮点数精度
1 2 3 4 5 6 7 8
| print(0.1 + 0.2 == 0.3)
local function approx_eq(a, b, epsilon) return math.abs(a - b) < (epsilon or 1e-10) end print(approx_eq(0.1 + 0.2, 0.3))
|
4.2 关系运算符
| 运算符 |
含义 |
示例 |
结果 |
== |
等于 |
5 == 5 |
true |
~= |
不等于 |
5 ~= 3 |
true |
< |
小于 |
3 < 5 |
true |
> |
大于 |
5 > 3 |
true |
<= |
小于等于 |
5 <= 5 |
true |
>= |
大于等于 |
5 >= 3 |
true |
比较规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| print(10 > 5) print(10 >= 10)
print("apple" < "banana") print("Apple" < "apple")
print(10 == "10") print(10 == 10.0)
local a = {1, 2} local b = {1, 2} local c = a print(a == b) print(a == c)
|
记住:Lua 中 == 用于相等判断,~= 用于不等判断。没有 ===(严格等于),因为不会发生类型转换。
4.3 逻辑运算符
| 运算符 |
含义 |
说明 |
and |
逻辑与 |
短路求值 |
or |
逻辑或 |
短路求值 |
not |
逻辑非 |
取反 |
短路求值机制
and: 如果第一个操作数为假,返回第一个操作数;否则返回第二个操作数。
or: 如果第一个操作数为真,返回第一个操作数;否则返回第二个操作数。
1 2 3 4 5 6 7 8 9 10
| print(false and error("不会执行")) print(nil and 100) print(true and 200) print(0 and "真")
print(true or error("不会执行")) print(false or "默认值") print(nil or 100)
|
常见用法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| local name = input_name or "匿名"
if input_name then name = input_name else name = "匿名" end
local function get_greeting(hour) return (hour < 12 and "上午好") or (hour < 18 and "下午好") or "晚上好" end
print(get_greeting(9)) print(get_greeting(14)) print(get_greeting(20))
local function safe_div(a, b) return b ~= 0 and a / b or nil end
print(safe_div(10, 2)) print(safe_div(10, 0))
|
not 运算符
1 2 3 4 5 6
| print(not true) print(not false) print(not nil) print(not 0) print(not "") print(not not 42)
|
4.4 字符串连接运算符 ..
字符串连接使用两个点 ..,不是 +:
1 2 3 4 5 6 7 8 9 10 11 12 13
| local s = "Hello" .. " " .. "World" print(s)
print("年龄:" .. 30)
local a = "abc" local b = a .. "def" print(a) print(b)
|
4.5 长度运算符 #
长度运算符返回字符串或数组的长度:
字符串长度
1 2 3 4 5 6
| print(#"hello") print(#"")
print(#"你好") print(#"Lua入门")
|
数组(表)长度
1 2 3 4 5 6 7 8 9 10 11
| local arr = {10, 20, 30} print(#arr)
local t = {1, nil, 3} print(#t)
local mix = {1, 2, 3, key = "value"} print(#mix)
|
4.6 运算符优先级
从高到低:
| 优先级 |
运算符 |
| 1(最高) |
^ |
| 2 |
-(负号) # not |
| 3 |
* / // % |
| 4 |
+ -(减法) |
| 5 |
..(连接) |
| 6 |
< > <= >= == ~= |
| 7 |
and |
| 8(最低) |
or |
1 2 3 4 5 6 7 8 9
| print(2 + 3 * 4) print((2 + 3) * 4) print(2 ^ 3 * 4) print(not true and false) print(true or false and false)
result = ((a + b) * c) / (d - e)
|
4.7 本章小结
| 类别 |
运算符 |
| 算术 |
+ - * / // % ^ |
| 关系 |
== ~= < > <= >= |
| 逻辑 |
and or not |
| 其他 |
..(连接) #(长度) |
| 赋值 |
=(不是运算符,是语句) |
练习题
- 计算
((5 + 3) * 2 ^ 3 - 10) % 7 的结果
- 利用
or 运算符为函数参数提供默认值
- 实现一个函数,判断年份是否为闰年(能被 4 整除但不能被 100 整除,或者能被 400 整除)
- 使用
# 运算符计算任意字符串的长度,并测试中文字符串
- 用
and 和 or 实现三目运算符:max = (a > b) and a or b