Lua 运算符

关键要点

  • 研究表明,Lua 的运算符包括算术、关系、逻辑、位运算(Lua 5.3+)、字符串连接和长度运算符,设计简洁,适合动态类型语言。
  • 证据显示,运算符优先级明确,.. 用于字符串连接,# 获取长度,位运算符支持整数操作。
  • 看起来很可能是通过 andornot 实现逻辑控制,关系运算符支持动态类型比较,需注意类型转换规则。

Lua 运算符简介

概述

Lua 的运算符用于执行算术、比较、逻辑和字符串操作,支持动态类型,操作结果根据变量类型自动调整。Lua 提供算术、关系、逻辑、位运算、字符串连接和长度运算符,语法简单,易于使用。本文详细讲解 Lua 运算符的类型、用法、优先级、示例及注意事项。

运算符类型

  • 算术运算符+, -, *, /, %, ^, //(整除,Lua 5.3+)。
  • 关系运算符==, ~=, <, >, <=, >=
  • 逻辑运算符and, or, not
  • 位运算符(Lua 5.3+):&, |, ~, >>, <<, ~=(按位异或)。
  • 其他运算符..(字符串连接),#(长度)。
  • 优先级:从高到低为 ^, not # -(一元), * / % //, + -, .., << >>, &, ~, |, < > <= >= ~= ==, and, or

参考资源


详细调研报告

本文为用户提供关于 Lua 运算符的全面中文讲解,涵盖算术、关系、逻辑、位运算、字符串连接、长度运算符、优先级及示例,基于可靠的在线资源和官方文档。

Lua 运算符概述

Lua 的运算符设计简洁,支持动态类型操作,自动根据变量类型执行计算或比较。研究表明,Lua 运算符包括常见的算术、关系和逻辑运算符,以及 Lua 5.3 引入的位运算符,..# 是 Lua 特有的字符串和长度操作工具。以下是详细分析:

  • 算术运算符
  • 类型
    • +:加法
    • -:减法
    • *:乘法
    • /:除法
    • %:取模
    • ^:幂运算
    • //:整除(Lua 5.3+)
    • -:一元负号
  • 示例
    lua local a, b = 10, 3 print(a + b) -- 输出:13 print(a - b) -- 输出:7 print(a * b) -- 输出:30 print(a / b) -- 输出:3.3333333333333 print(a % b) -- 输出:1 print(a ^ 2) -- 输出:100 print(a // b) -- 输出:3 print(-a) -- 输出:-10
  • 注意
    • 算术运算符主要用于 number 类型,字符串会尝试转换为数字。
    • // 结果为整数,适合需要整除的场景。
    • 示例(类型转换):
    print("5" + 3) -- 输出:8(字符串 "5" 转为数字)
  • 关系运算符
  • 类型
    • ==:等于
    • ~=:不等于
    • <:小于
    • >:大于
    • <=:小于等于
    • >=:大于等于
  • 示例
    lua local a, b = 10, 20 print(a == b) -- 输出:false print(a ~= b) -- 输出:true print(a < b) -- 输出:true print(a > b) -- 输出:false print(a <= 10) -- 输出:true print(a >= 5) -- 输出:true
  • 注意
    • 关系运算符支持不同类型比较,字符串会尝试转换为数字。
    • 表、函数等复杂类型比较基于引用,需谨慎。
    • 示例:
    print("10" == 10) -- 输出:true(字符串转为数字) local t1 = {} local t2 = {} print(t1 == t2) -- 输出:false(不同引用)
  • 逻辑运算符
  • 类型
    • and:逻辑与
    • or:逻辑或
    • not:逻辑非
  • 说明
    • and:返回第一个为假的参数,或最后一个参数(如果都为真)。
    • or:返回第一个为真的参数,或最后一个参数(如果都为假)。
    • not:将真转为 false,假转为 true
  • 示例
    lua local a, b = true, false print(a and b) -- 输出:false print(a or b) -- 输出:true print(not a) -- 输出:false print(5 and 10) -- 输出:10(都为真,返回最后一个) print(nil or 20) -- 输出:20(nil 为假,返回第一个真值)
  • 注意
    • Lua 中只有 nilfalse 为假,其他值(包括 0 和空字符串)为真。
    • 示例:
    print(0 and true) -- 输出:true(0 为真) print("" or 5) -- 输出:5(空字符串为真)
  • 位运算符(Lua 5.3+):
  • 类型
    • &:按位与
    • |:按位或
    • ~:按位异或
    • >>:右移
    • <<:左移
    • ~:按位非(一元)
  • 示例
    lua local a, b = 5, 3 -- 二进制:5 = 101, 3 = 011 print(a & b) -- 输出:1(001) print(a | b) -- 输出:7(111) print(a ~ b) -- 输出:6(110) print(a >> 1) -- 输出:2(010) print(a << 1) -- 输出:10(1010) print(~a) -- 输出:-6(按位取反)
  • 注意
    • 位运算符仅对整数有效,非整数会报错。
    • 需确保 Lua 版本支持(5.3+)。
  • 字符串连接运算符(..
  • 说明:连接两个字符串,或将非字符串类型转换为字符串后连接。
  • 示例
    lua local str = "Hello" .. " Lua" print(str) -- 输出:Hello Lua print(10 .. 20) -- 输出:1020(数字转为字符串)
  • 注意:非字符串类型会自动调用 tostring() 转换。
  • 长度运算符(#
  • 说明:返回字符串长度或表的数组部分长度(连续整数索引)。
  • 示例
    lua local str = "Hello" local arr = {1, 2, 3, nil, 5} print(#str) -- 输出:5 print(#arr) -- 输出:3(只计数连续索引)
  • 注意
    • 对于表,# 只计算从索引 1 开始的连续非 nil 部分。
    • 示例:
    local t = {1, 2, [4] = 4} print(#t) -- 输出:2(忽略非连续索引)
  • 运算符优先级
  • 从高到低:
    1. ^(幂运算)
    2. not, #, -(一元负号)
    3. *, /, %, //
    4. +, -
    5. ..
    6. <<, >>
    7. &
    8. ~(按位异或)
    9. |
    10. <, >, <=, >=, ~=, ==
    11. and
    12. or
  • 示例
    lua print(2 + 3 * 4) -- 输出:14(* 优先于 +) print((2 + 3) * 4) -- 输出:20(括号提高优先级) print(5 + 2 ^ 3) -- 输出:13(^ 优先于 +) print(true or false and false) -- 输出:true(and 优先于 or)
  • 注意:使用括号明确优先级,提高代码可读性。

实际应用示例

以下是一个综合示例,展示多种运算符的用法:

-- 示例:学生成绩处理
local student = {name = "Alice", score = 85}

-- 算术运算符:成绩调整
local adjusted_score = student.score * 1.1 + 5  -- 放大 10% 并加 5
print("调整后成绩: " .. adjusted_score)  -- 输出:调整后成绩: 98.5

-- 关系运算符:评级
if adjusted_score >= 90 then
    print("评级: 优秀")
elseif adjusted_score >= 80 then
    print("评级: 良好")
else
    print("评级: 及格")
end

-- 逻辑运算符:检查条件
local is_valid = student.score ~= nil and adjusted_score <= 100
print("成绩有效: " .. tostring(is_valid))  -- 输出:成绩有效: true

-- 字符串连接:生成报告
local report = "学生: " .. student.name .. ", 成绩: " .. student.score
print(report)  -- 输出:学生: Alice, 成绩: 85

-- 长度运算符:检查名称长度
print("名字长度: " .. #student.name)  -- 输出:名字长度: 5

-- 位运算符(Lua 5.3+):标志位
local flags = 5 | 2  -- 二进制:101 | 010 = 111
print("标志位: " .. flags)  -- 输出:标志位: 7
-- 示例:学生成绩处理
local student = {name = "Alice", score = 85}

-- 算术运算符:成绩调整
local adjusted_score = student.score * 1.1 + 5  -- 放大 10% 并加 5
print("调整后成绩: " .. adjusted_score)  -- 输出:调整后成绩: 98.5

-- 关系运算符:评级
if adjusted_score >= 90 then
    print("评级: 优秀")
elseif adjusted_score >= 80 then
    print("评级: 良好")
else
    print("评级: 及格")
end

-- 逻辑运算符:检查条件
local is_valid = student.score ~= nil and adjusted_score <= 100
print("成绩有效: " .. tostring(is_valid))  -- 输出:成绩有效: true

-- 字符串连接:生成报告
local report = "学生: " .. student.name .. ", 成绩: " .. student.score
print(report)  -- 输出:学生: Alice, 成绩: 85

-- 长度运算符:检查名称长度
print("名字长度: " .. #student.name)  -- 输出:名字长度: 5

-- 位运算符(Lua 5.3+):标志位
local flags = 5 | 2  -- 二进制:101 | 010 = 111
print("标志位: " .. flags)  -- 输出:标志位: 7

输出:

调整后成绩: 98.5
评级: 优秀
成绩有效: true
学生: Alice, 成绩: 85
名字长度: 5
标志位: 7

注意事项

  • 类型转换:算术和关系运算符可能自动将字符串转为数字,需检查类型。
  • 逻辑运算:只有 nilfalse 为假,0 和空字符串为真。
  • 位运算:仅 Lua 5.3+ 支持,操作对象需为整数。
  • 表比较==~= 比较表引用,而非内容,需谨慎。
  • 优先级:使用括号明确复杂表达式的运算顺序。
  • 编码:中文字符串需保存为 UTF-8 编码,避免乱码。

推荐资源

这些资源基于当前可访问的在线内容,截至 2025 年 8 月 2 日有效。

结论

Lua 的运算符简洁高效,涵盖算术、关系、逻辑、位运算、字符串连接和长度操作,适合动态类型语言的灵活需求。推荐熟悉优先级规则,使用括号提高代码清晰度。用户可通过示例练习掌握运算符用法,结合 IDE(如 ZeroBrane Studio)提高开发效率。

表格总结

运算符类型运算符描述示例
算术+ - * / % ^ //加、减、乘、除、模、幂、整除10 + 3, 2 ^ 3
关系== ~= < > <= >=等于、不等于、小于、大于等5 == 5, 10 ~= 3
逻辑and or not与、或、非true and false, not true
位运算(5.3+)& | ~ >> << ~按位与、或、异或、移位、非5 & 3, 5 >> 1
字符串连接..连接字符串"Hello" .. " Lua"
长度#字符串或表长度#"Hello", #{1, 2, 3}

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注