Lua05运算符、字符串与数组

这篇博客详细介绍了Lua中的各种运算符,包括算术运算符(如加、减、乘、除、取余、取商、乘幂)、关系运算符(如等于、不等于、大于、小于、大于等于、小于等于)、逻辑运算符(如and、or、not)以及其他运算符(如字符串连接)。还特别提到了Lua中的字符串操作,如字符串长度、转义字符、连接和格式化。此外,文章讨论了Lua数组的概念,包括一维数组和多维数组的创建与访问。
摘要由CSDN通过智能技术生成

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
\ddd1到3位八进制数所代表的任意字符三位八进制
\xhh1到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 提供了很多的方法来支持字符串的操作:

序号方法 & 用途
1string.upper(argument): 字符串全部转为大写字母。
2string.lower(argument): 字符串全部转为小写字母。
3string.gsub(mainString,findString,replaceString,num) 在字符串中替换,mainString为要替换的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:
> string.gsub("aaaa","a","z",3); zzza 3
4string.find (str, substr, [init, [end]]) 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
> string.find("Hello Lua user", "Lua", 1) 7 9
5string.reverse(arg) 字符串反转
> string.reverse("Lua") auL
6string.format(…) 返回一个类似printf的格式化字符串
> string.format("the value is:%d",4) the value is:4
7string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。
> string.char(97,98,99,100) abcd
> string.byte("ABCD",4) 68
> string.byte("ABCD") 65
8string.len(arg) 计算字符串长度。
string.len("abc") 3
9string.rep(string, n)) 返回字符串string的n个拷贝
> string.rep("abcd",2) abcdabcd
10 链接两个字符串
> print("hello".."world") helloworld
11string.sub(s, i, j) :从字符串s中提取第i个到第j个字符(包括i和j),索引从1开始。如:
> string.sub("HelloWorld", 1, 3) Hel
12string.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值