Lua 小白入门教程Lua 小白入门教程
首页
基础教程
实战进阶
编程指南
首页
基础教程
实战进阶
编程指南
  • 基础教程

    • 📚 基础教程
    • 第1章 - Lua 是什么?
    • 第2章 - 环境搭建
    • 第3章 - 变量与数据类型
    • 第4章 - 运算符与表达式
    • 第5章 - 流程控制
    • 第6章 - 函数
    • 第7章 - Table(表)
    • 第8章 - 字符串与模式匹配

第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 = 1024Java: 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 获取数组长度

⚖️ 关系运算符

运算符说明LuaJava
==等于a == ba == b
~=不等于a ~= ba != b ⚠️
<小于a < ba < b
>大于a > ba > b
<=小于等于a <= ba <= b
>=大于等于a >= ba >= 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,不同类型不会自动转换进行比较

🧠 逻辑运算符

LuaJava说明
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 和循环怎么写。

💪 练习题

  1. 10 / 3 和 10 // 3 分别等于多少?
  2. Lua 的不等于运算符是什么?
  3. nil or "hello" 的结果是什么?
  4. 如何用 and/or 模拟 Java 的三元运算符 x > 0 ? "正数" : "非正数"?

答案提示

  1. 10 / 3 = 3.3333...,10 // 3 = 3
  2. ~=
  3. "hello"(nil 为假,所以 or 返回第二个值)
  4. x > 0 and "正数" or "非正数"
最近更新: 2026/2/27 17:54
Contributors: 王长安
Prev
第3章 - 变量与数据类型
Next
第5章 - 流程控制