四、表达式
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提供了通用的初始化格式——在方括号之间,显式地用一个表达式来初始化索引值