Lua学习笔记(二)

这篇博客详细介绍了Lua语言中的表达式,包括算数、关系和逻辑操作符,以及操作符优先级和构造式。接着,讨论了语句,如赋值、局部变量和控制结构。此外,重点讲解了函数的用法,如多重返回值、变长参数和具名实参。最后,深入探讨了Lua中的闭包函数、非全局函数和尾调用的概念,展示了Lua函数的灵活性和强大功能。
摘要由CSDN通过智能技术生成

四、表达式

1、算数操作符

      除了基本的“+ - * /”,Lua中特殊的在于“^”表示指数运算;“%”取模可用于任何实数(而非C中仅限整型)。

a=8^(1/3) --计算8的1/3次

10.3%4    --等于2.3

其中“%”是根据以下规则定义的:

a%b=a-floor(a/b)*b      --floor是向下取整函数

      故对于小数取模有一些特别的用法:

x%1结果是x的小数部分,x-x%1就是x的整数部分。x%0.01是x小数点后两位之后(小数点后第三位开始)的部分,x-x%0.01就是x精确到小数后两位的结果。类似地,可以x-x%0.001来获得精确到小数点后3位的结果。

2、关系操作符

“<”、“>”、“<=”、“>=”、“==”、“~=”

其中“~=”表示不等于。如果两个值的类型不同,则认为不等。关系操作符运算结果返回true或false。

值得注意的是只有同种类型的值才能进行大小性判断,不同类型的值只能进行相等性判断

2<”15”  --类型不同,出错

2 == “15”--可以判断

对于table、userdata、function,Lua是做引用比较的。只有当它们引用用一个对象时,才认为相等。并且只能进行相等性判断。

只有数字和字符串可以进行大小性判断。

3、逻辑操作符

     and      or        not

区别于C和Java的是,逻辑操作符返回的结果不一定是boolean型的,也可能是一个操作数

与条件控制语句一样,所有的逻辑操作符将false和nil作为假,其他任何视为真。

对于and,如果第一个操作数为真,返回第二个操作数;如果第一个操作数为假,返回第一个操作数——操作数本身的值,故操作数是什么就返回什么。

print(4 and 5) -->5

print(false and 5)   -->false

print(nil and 3)       -->nil

同理,对于or也是返回操作数。第一个操作数为真,则返回第一个操作数,否则返回第二个操作数。

print(4 or 5)           -->4

print(false or 5)      -->5

print(nil or false)    -->false

与C相同的是,Lua的逻辑操作符也会“short-cut evaluation”,即前面的条件已可得到结果就不计算后面的。

Lua中常用“x=x or v”来对x设默认值为v。这句话表示x为假(没有设置x时为nil),则取v的值;如果不为假则不改变。

还有“a and b or c”,当b恒为真时,等价与C中的“a?b:c”。常用于求两者之间的最大值:

max=(x>y) and x or y

x>y时,(x>y)为真,(x>y) and x等于x,x必为真故x or y等于x,所以max=x;反之(x>y)为假,(x>y) and x返回假,假or y等于y。(and的优先级高于or)

非操作符not只返回true或false。

 

4、操作符优先级

 

 

 

 

 

 

^

not   #  - (一元操作符)

*   /  %

+  -

..

<      >      <=      >=       ~=      ==

and

or

其中“^”和”..”是“右结合”的,即自右向左结合,其余为左结合。

5、构造式

构造式是用于初始化table的。除了用{}来初始化一个空table外,还有“列表”风格、“记录”风格、“通用”风格的方式来初始化table。

(1)“列表”风格

days={“Mon”,”Tue”,”Wed”,”Thu”}

这种方式直接对table赋值,不指定索引值,故默认为是一个普通数组,默认索引为从1开始的整数。故days[1]=”Mon”;days[2]= ”Tue”。

(2)“记录”风格

      “记录”风格即“什么等于什么”的形式,指定索引值和元素值。

      a={x=1,y=2}  -- 等价于a={};a.x=1;a.y=2

      x=1,y=2中x、y是字符串“x”、“y”。而不是变量x(如果前面有定义x变量)

      可以用这种方式实现链表:

      list=nil

       for i=1,10 do

              list={next=list,val=i}

       end

      上述程序得到一个反序的链表。链表的每一个结点都是个table,table中包含next和val两个字段。next指向上一次创建的表,所以是反序的:

      nilß1ß2ß3ß4ß5ß6ß7ß8ß9ß10

      “记录”风格指定了索引(字段名),就可以用“表名.索引名”的方式引用元素。如print(a.x)

     (3)“列表”风格与“记录”风格结合

polyline={color=”red”,thickness=2,npoint=4;

{x=0,y=0},

{x=-10,y=0},

{x=-10,y=1},

{x=0,y=1},

} --“;”常用来分割两种不同风格,用“,”也没错

其中{x=0,y=0}是一个table,作为polyline的元素,由于其形式是“列表”风格,故其索引值为1.有

print(polyline[2].x)  -->-10

print(polyline[4].y)  -->1

(4)通用”风格

“列表”风格与“记录”风格都存在不能使用负数、运算符作为索引的限制。Lua提供了通用的初始化格式——在方括号之间,显式地用一个表达式来初始化索引值࿱

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值