网站首页 > 基础教程 正文
算术运算
除了加、减、乘、除等常见的运算之外,Lua还支持取整除法、取模和指数运算。
print(-1 + 3) -- 3 print(0.1 + 0.2 == 0.3) -- false 和C语言类似浮点运算不精确,相等判断会有问题 print(1 - 2) -- -1 print(2 * 3) -- 6 print(5 / 2) -- 2.5 print(5 // 2) -- 2 Lua5.3引入 print(5 % 3) -- 2 print(-5 % 3) -- 1 print(2 ^ 3) -- 8
Lua中除法的结果都是浮点数(即使两个操作数都是整数,且能整除),如果想要得到向下取整的结果,可以用math.floor()函数。Lua5.3为这种向下取整的除法引入了一个新的运算符//,对除法得到的结果向负无穷取整。
print(math.type(4 / 2)) -- float print(math.floor(5 / 2)) -- 2 print(math.type(math.floor(5 / 2))) -- integer -- 注意,Lua5.3之前所有的数值类型都浮点数,5.3才引入整数 print(-9 // 2) -- -5
取模运算需要注意有负数的情况,和其他语言有可能得出的结果不同,Lua的计算方法如下:
a % b == a - ((a // b) * b)
结果的符号和第二个操作数一致。
print(5 % 3) -- 2 print(-5 % 3) -- 1 print(5 % -3) -- -1 --[[ 注意!在C语言中: 5 % 3 == 2 -5 % 3 == -2 5 % -3 == 2 ]]
关系运算
Lua提供了以下的关系运算:
- 大于 >
- 小于 <
- 等于 ==
- 不等于 ~=
- 大于或等于 >=
- 小于或等于 <=
这些关系运算的结果都是布尔型。注意:
- 不同类型的变量不相等,但是整数、浮点数这种细分的子类型不区分,都视为数字类型。
- Lua中的等于判断,是对变量对应内存地址的判断,两个表即使内容相同也是不相等的。
print(2 > 3) -- false print(2 < 3) -- true print(2 == 3) -- false print(2 ~= 3) -- true print(2 == 2.0) -- true print(nil == false) -- false print(nil == 0) -- false print(1 == true) -- false print(0 == false) -- false 没有类似C语言的类型转换 print(1 == "1") -- false 不同的类型不相等 print('1' == "1") -- true print('a' == 'a') -- true print({} == {}) -- false
逻辑运算
lua提供了三个逻辑符:and、or 、not
- and 逻辑与操作符。 true and false 为 false。
- or 逻辑或操作符。 true or false 为 true。
- not 逻辑非操作符。not false 为 true。
和其他语言类似,判断有短路效果,即:
- and操作第一个为false,就不再执行后面的判断
- or操作第一个为true,也不再执行后台的判断
local a, b = 1, 2; function change_value() b = 3 return true end if (a == 2 and change_value()) then end print(b) -- 输出2 a==2为false,不再执行change_value() if (a == 1 or change_value()) then end print(b) -- 输出2 a==1为true,不再执行change_value() if (a == 2 or change_value()) then end print(b) -- 输出3 a==2为false,需要继续执行change_value()判断 if (not(a == 2)) then print('a ~= 2') -- 会执行到这里 else print('a == 2') end -- 复杂的判断中使用not时最好不要省略括号,否则运算符的优先级会导致和想象中不一致的结果(后面会有各运算符的优先级顺序) if (not a == 2) then -- not的优先级比==高,会先计算 not a 得出false,再计算 false == 2,最终结果是false print('true') else print('false') -- 会执行到这里 end
位运算
Lua5.3提供了以下位运算,5.3以下的版本不支持:
- & 按位与
- | 按位或
- ~ 按位异或,当用作一无运算符时是按位取反
- >> 逻辑右移,用0填充,Lua没有提供算术右移(即用符号位填充)
- << 逻辑左移
其他运算符
- .. 连接两个字符串
- # 一元运算符,返回字符串或表的长度。 #"Hello" 返回 5
print('www.' .. 'daemoncoder' .. '.com') -- www.daemoncoder.com print('wow ' .. 23333) -- wow 23333 print('wow ' .. -666) -- wow -666 print('wow ' .. 2.333) -- wow 2.333 --print('wow ' .. nil) -- 报错 --print('wow ' .. false) -- 报错 --print('wow ' .. true) -- 报错 print(#'www.daemoncoder.com') -- 19 print(#'汉字') -- 6 多字节字符使用时需要注意,计算出的长度是字节长度。 print(#{'www.', 'daemoncoder', '.com'}) -- 3
运算符的优先级
Lua中的运算符优先级从高到低排列如下:
- ^
- -(这里是一元运算符取反,不是减号) # not ~(这里是一元运算符按位取反)
- * / // %
- + -(这里是二元运算符减号,不是取反)
- ..
- << >>
- &
- ~(这里是二元操作符按位异或)
- |
- < > <= >= ~= ==
- and
- or
更多优质内容,请关注daemoncoder.com
- 上一篇: lua位运算 配置文件通道开关 lua位运算效率低
- 下一篇: Lua 函数 lua函数库
猜你喜欢
- 2024-10-23 按键精灵自动寻路系列换算地图坐标寻路法
- 2024-10-23 [Redis],Lua分步式限流方案,限流分几步?
- 2024-10-23 基于FEKO软件的目标RCS计算及数据分析
- 2024-10-23 [按键精灵]会员时间相关计算/转换的代码讲解
- 2024-10-23 lua math.deg使用 lua的match
- 2024-10-23 梯度下降方法与求导 梯度下降求导过程
- 2024-10-23 redisson实现分布式锁原理 redisson分布式锁问题
- 2024-10-23 万字长文:从源码学习GopherLua与工程实践
- 2024-10-23 LUA入门简易小应用 lua用什么软件编程
- 2024-10-23 lua math.asin使用 lua assert函数
- 05-14CSS基础知识(一) CSS入门
- 05-14CSS是什么? CSS和HTML有什么关系?
- 05-14什么是CSS3?
- 05-14CSS如何画一个三角形?
- 05-14初识CSS——CSS三角制作
- 05-14Wordpress建站教程:给图片添加CSS样式
- 05-14HTML和HTML5,css和css3的区别有哪些?
- 05-14Html中Css样式Ⅱ
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)