Lua运算符
- 运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:算术运算符、关系运算符、逻辑运算符、其他运算符。
算术运算符
设定 A 的值为15,B 的值为 20。
操作符 | 描述 | 实例 |
---|---|---|
+ | 加法 | A + B 输出结果 35 integer |
- | 减法 | A - B 输出结果 -5 integer |
* | 乘法 | A * B 输出结果 300 integer |
/ | 除法 | A / B 输出结果 0.75 float 。4/2结果2.0 |
% | 取余 | B % A 输出结果 5 integer |
// | 取商 | B // A 输出结果 1 integer |
^ | 乘幂 | A^2 输出结果 225.0 float |
- | 负号 | -A 输出结果v -15 integer |
- **如果想要区分整型值和浮点型值,**可以使用
math.type()
函数 - Lua 5.3引入整型的主要建议是:开发人员要么选择忽略整型和浮点型二者之间的不同,要么就完整地控制每一个数值的表示。因此, 所有的算术操作符不论操作整型值还是浮点型值,结果都是一样的
- 如果两个操作数都是整型值,则结果也是整型值;否则就是浮点型值 ,当两个操作数的类型不同时,运算之前会先将整型值转换为浮点型值。
关系运算符
操作符 | 描述 |
---|---|
== | 等于,检测两个值是否相等,相等返回 true,否则返回 false |
~= | 不等于,检测两个值是否相等,相等返回 false,否则返回 true< |
> | 大于,如果左边的值大于右边的值,返回 true,否则返回 false |
< | 小于,如果左边的值大于右边的值,返回 false,否则返回 true |
>= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false |
<= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false |
-
Lua关系运算的结果都是boolean类型
-
==、~=说明: 这两个运算符可以应用于任意两个值, 当这两个值的类型不同时,Lua语言认为它们是不相等的 ;否则,会根据它们的类型再对两者进行比较
-
比较数值时永远忽略数值的子类型, 数值究竟是以整型还是浮点型表示并无区别,只与算术值有关(尽管如此,比较具有相同子类型的数值时效率更高)
逻辑运算符
操作符 | 描述 |
---|---|
and | 逻辑与操作符。 如果两边的操作都为 true 则条件为 true。 |
or | 逻辑或操作符。 如果两边的操作任一一个为 true 则条件为 true。 |
not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 |
其他运算符
操作符 | 描述 | 实例 |
---|---|---|
… | 连接两个字符串 | a…b ,其中 a 为 "Hello " , b 为 “World”, 输出结果为 “Hello World”。 |
# | 一元运算符,返回字符串或表的长度。 | #“Hello” 返回 5 |
运算符优先级
从高到低:
^
一元运算符 (not # - ~)
* / // %
+ -
..
<< >>
&
~
|
< > <= >= ~= ==
and
or
除了^和…外所有的二元运算符都是左连接的。
a+i < b/2+1 <--> (a+i) < ((b/2)+1)
5+x^2*8 <--> 5+((x^2)*8)
a < y and y <= z <--> (a < y) and (y <= z)
-x^2 <--> -(x^2)
x^y^z <--> x^(y^z)
Lua字符串
- Lua语言中的字符串 是一串字节组成的序列。 在Lua语言中, 字符使用8个比特位来存储
- Lua语言中的字符串 可以存储包括空字符在内的所有数值代码 ,这意味着我们可以在字符串中存储任意的二进制数据
- 我们也 可以使用任意一种编码方式(UTF-8、UTF-16等)来存储Unicode字符串
字符串常量
- 可以使用一对双引号或者单引号来声明字符串常量
a = 'string'
a = "string"
- 双引号和单引号声明字符串是等价的, 引号内的另一种引号不会转义
a = 'this is a "string"'
a = "this is a 'string'"
转义字符
转义字符 | 意义 | ASCII码值(十进制) |
---|---|---|
\a | 响铃(BEL) | 007 |
\b | 退格(BS) ,将当前位置移到前一列 | 008 |
\f | 换页(FF),将当前位置移到下页开头 | 012 |
\n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
\r | 回车(CR) ,将当前位置移到本行开头 | 013 |
\t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
\v | 垂直制表(VT) | 011 |
\ | 代表一个反斜线字符’’’ | 092 |
’ | 代表一个单引号(撇号)字符 | 039 |
" | 代表一个双引号字符 | 034 |
空字符(NULL) | 000 | |
\ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
\xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |
字符串长度
- 可以使用长度操作符
#
获取字符串的长度
a = "hello"
print(#a) -- 5
print(#"hello world") -- 11
字符串拼接
-
可以使用连接操作符
..
来进行字符串连接 -
如果操作数中有数值,那么会把数值转换为字符串。数字后面使用连接符时,必须要用一个
空格
隔开,否则Lua会把数字后面的第一个.当成小数点。 -
在Lua中,字符串是不可变变量。字符串连接总是创建一个新字符串,而不会改变原来操作数的字符串。
"aa"..3 .."bb" --aa3bb
多行字符串
- 像常长注释/多行注释一样,可以使用一对双方括号来声明长字符串/多行字符串常量
page = [[
<html>
<head>
<title> An HTML Page</tile>
</head>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
</html>
]]
-- 多行字符串的换行有效,换行符\n不会被转义
特殊字符串声明
如下特殊字符串会出现问题:
string = [[
Hello
-- [[ 注释 ]]
World
]]
string = "a=b[c[i]]"
print(string)
- 为了应对这种情况, 可以在左方括号之间加上任意数量的等号 例如
[===[string]===]
时才会结束
- **对于注释而言,这种机制也同样使用,**例如可以使用
--[=[]=]
来表示长注释
字符串操作
Lua 提供了很多的方法来支持字符串的操作:
序号 | 方法 & 用途 |
---|---|
1 | string.upper(argument): 字符串全部转为大写字母。 |
2 | string.lower(argument): 字符串全部转为小写字母。 |
3 | string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:> string.gsub("aaaa","a","z",3); zzza 3 |
4 | string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。> string.find("Hello Lua user", "Lua", 1) 7 9 |
5 | string.reverse(arg) 字符串反转> string.reverse("Lua") auL |
6 | string.format(…) 返回一个类似printf的格式化字符串> string.format("the value is:%d",4) the value is:4 |
7 | string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 |
8 | string.len(arg) 计算字符串长度。string.len("abc") 3 |
9 | string.rep(string, n)) 返回字符串string的n个拷贝> string.rep("abcd",2) abcdabcd |
10 | … 链接两个字符串> print("hello".."world") helloworld |
11 | string.sub(s, i, j) :从字符串s中提取第i个到第j个字符(包括i和j),索引从1开始。如:> string.sub("HelloWorld", 1, 3) Hel |
12 | string.format() : 格式化的输出,类似于C语言的print()函数 |
Lua数组
- Lua 数组其实就是使用整数作为索引的表,数组的大小不是固定的, nil来标记列表的结束
- 在Lua语言中, 数组索引一般从1开始 (而不是像C语言一样从0开始),Lua中的其它许多机制也遵循这个管理
一维数组
一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for循环出数组中的元素,如下实例
a = {}
-- 先输入5个元素
for i = 1, 5 do
a[i] = io.read()
end
-- 打印5个元素
for i = 1, 10 do
print(a[i])
end
多维数组
多维数组即数组中包含数组或一维数组的索引键对应一个数组。
以下是一个三行三列的阵列多维数组:
-- 初始化数组
array = {}
for i=1,3 do
array[i] = {}
for j=1,3 do
array[i][j] = i*j
end
end
-- 访问数组
for i=1,3 do
for j=1,3 do
print(array[i][j])
end
end
不同索引键的三行三列阵列多维数组:
-- 初始化数组
array = {}
maxRows = 3
maxColumns = 3
for row=1,maxRows do
for col=1,maxColumns do
array[row*maxColumns +col] = row*col
end
end
-- 访问数组
for row=1,maxRows do
for col=1,maxColumns do
print(array[row*maxColumns +col])
end
end
结果均为:
1
2
3
2
4
6
3
6
9