第4章 - 运算符与表达式
嗨,朋友!我是长安。
这一章我们来看看 Lua 的运算符。大部分和 Java 差不多,但有几个地方完全不同,特别容易踩坑。我会一一帮你标出来!
🔢 算术运算符
| 运算符 | 说明 | Lua 示例 | Java 对比 |
|---|---|---|---|
+ | 加法 | 5 + 3 = 8 | 相同 |
- | 减法 | 5 - 3 = 2 | 相同 |
* | 乘法 | 5 * 3 = 15 | 相同 |
/ | 除法 | 5 / 3 = 1.6667 | ⚠️ Java: 5/3=1 |
// | 整数除法 | 5 // 3 = 1 | 类似 Java 的 / |
% | 取余 | 5 % 3 = 2 | 相同 |
^ | 幂运算 | 2 ^ 10 = 1024 | Java: Math.pow(2,10) |
- | 取负 | -5 | 相同 |
-- 除法:Lua 和 Java 最大的不同
print(10 / 3) -- 3.3333333333333(总是返回浮点数)
print(10 // 3) -- 3(整数除法)
-- 幂运算:Lua 用 ^ ,Java 用 Math.pow()
print(2 ^ 10) -- 1024.0
-- Java: Math.pow(2, 10) = 1024.0
-- 取余
print(10 % 3) -- 1
注意
Java 中 ^ 是异或运算符,Lua 中 ^ 是幂运算符!这是一个非常容易搞混的地方。
🔗 字符串拼接运算符
-- Lua 用 .. 拼接字符串
local s = "Hello" .. " " .. "World"
print(s) -- Hello World
-- 数字会自动转为字符串
print(10 .. 20) -- 1020
print("Age: " .. 25) -- Age: 25
// Java 用 + 拼接字符串
String s = "Hello" + " " + "World";
System.out.println(s); // Hello World
📏 长度运算符
-- # 获取字符串长度或表的长度
local s = "Hello"
print(#s) -- 5
local t = {1, 2, 3, 4, 5}
print(#t) -- 5
-- Java 对比:
-- s.length() 获取字符串长度
-- list.size() 获取集合大小
-- array.length 获取数组长度
⚖️ 关系运算符
| 运算符 | 说明 | Lua | Java |
|---|---|---|---|
== | 等于 | a == b | a == b |
~= | 不等于 | a ~= b | a != b ⚠️ |
< | 小于 | a < b | a < b |
> | 大于 | a > b | a > b |
<= | 小于等于 | a <= b | a <= b |
>= | 大于等于 | a >= b | a >= b |
print(1 == 1) -- true
print(1 ~= 2) -- true(注意!不是 != )
print("abc" == "abc") -- true
-- 不同类型比较永远不相等
print(1 == "1") -- false(不会自动转换类型!)
print(nil == false) -- false(nil 和 false 不相等)
最容易踩的坑
- Lua 的不等于是
~=,不是!=!刚从 Java 转过来的人经常写错 1 == "1"在 Lua 中是false,不同类型不会自动转换进行比较
🧠 逻辑运算符
| Lua | Java | 说明 |
|---|---|---|
and | && | 逻辑与 |
or | || | 逻辑或 |
not | ! | 逻辑非 |
-- Lua 用英文单词,Java 用符号
print(true and false) -- false
print(true or false) -- true
print(not true) -- false
🌟 Lua 逻辑运算符的特殊用法
Lua 的 and 和 or 不是简单地返回 true/false,它们返回的是操作数本身!
-- and:如果第一个值为假,返回第一个值;否则返回第二个值
print(nil and 10) -- nil
print(false and 10) -- false
print(1 and 10) -- 10
print(1 and 2) -- 2
-- or:如果第一个值为真,返回第一个值;否则返回第二个值
print(nil or 10) -- 10
print(false or 10) -- 10
print(1 or 10) -- 1
-- 实用技巧:设置默认值(类似 Java 的三元运算符)
local name = inputName or "默认名称"
-- 等价于 Java: String name = (inputName != null) ? inputName : "默认名称";
超实用技巧
Lua 没有三元运算符 ? :,但你可以用 and/or 模拟:
-- 模拟三元运算符
local result = condition and valueIfTrue or valueIfFalse
-- 等价于 Java 的:
-- var result = condition ? valueIfTrue : valueIfFalse;
⚠️ 注意:当 valueIfTrue 为 false 或 nil 时,这个技巧会失效!
🔀 没有的运算符
Lua 中没有以下 Java 常用的运算符:
| Java 运算符 | Lua 替代方案 |
|---|---|
++ / -- | x = x + 1 / x = x - 1 |
+= / -= | x = x + 1 / x = x - 1 |
? : 三元运算符 | a and b or c |
!= | ~= |
&& / || | and / or |
! | not |
& / | 位运算 | Lua 5.3+ 有 & / | |
-- Lua 没有 ++ 和 +=
local count = 0
count = count + 1 -- 只能这样写
-- count++ -- 错误!
-- count += 1 -- 错误!
🔧 运算符优先级
从高到低:
^ -- 幂(右结合)
not # - -- 一元运算符
* / // % -- 乘除
+ - -- 加减
.. -- 字符串拼接(右结合)
< > <= >= ~= == -- 关系
and -- 逻辑与
or -- 逻辑或
建议
和 Java 一样,不确定优先级就加括号!代码可读性比少写几个字符重要得多。
📝 小结
- 除法
/总是返回浮点数,整数除法用// - 不等于是
~=,不是!= - 逻辑运算用
and、or、not(不是&&、||、!) and/or返回操作数本身,可以用来模拟三元运算符和默认值- 没有
++、+=等复合运算符 - 幂运算用
^(Java 中^是异或)
➡️ 下一步
运算符掌握了,下一章我们来学习 流程控制,看看 Lua 的 if/else 和循环怎么写。
💪 练习题
10 / 3和10 // 3分别等于多少?- Lua 的不等于运算符是什么?
nil or "hello"的结果是什么?- 如何用
and/or模拟 Java 的三元运算符x > 0 ? "正数" : "非正数"?
答案提示
10 / 3 = 3.3333...,10 // 3 = 3~="hello"(nil为假,所以or返回第二个值)x > 0 and "正数" or "非正数"
