关于Lua的表达式涵盖:数字常量,字符串,变量,一元和二元操作符,还有函数的调用。
3.1 算术运算符(Arithmetic Operators)
Lua中的算术运算符包括:+、-、*、/、^(幂运算)、%(模运算)、-(负数)这七种操作符。要求操作数必须为实数。书中提到的模运算的定义:
a % b = a - math.floor(a/b)*b
操作数的不同会影响到结果的类型。当操作数是整数的时候,操作符返回的结果类型与第二个操作数的类型保持一致;而当操作数是实数的时候,返回结果就会有所差异。借鉴书中的例子:
x = 1.11
x % 1 --返回的是x的小数部分
print(x % 1) -- 0.11
根据这一特性,执行x - x%1操作时就可以得到其整数部分。当我们想保留某个数的小数点后几位时,可以执行以下操作:
x = 1.111111
--保留后两位
print(x - x% 0.01) --1.11
--保留后三位
print(x - x % 0.001) --1.111
3.2 关系运算符(Relational Operators)
Lua中的关系运算符主要有:<、>、<=、>=、==、~=(不等于),关系运算符的操作结果是布尔值。
Lua中关于table和userdata的关系运算:因为lua是以引用的方式去比较table和userdata,因此只有当这两个类型变量完全一样时才会相等,如下:
a = {};a.x = 1;a.y = 0
b = {};b.x = 1;b.y = 0
c = a
-- c == a ; a ~= b
print(a == b) --false
print(a == c) --true
要注意的不同类型的变量进行比较的时候,其结果可能会不同:2<15 但是"2">"15"
3.3 逻辑运算符(Logical Operators)
Lua中的逻辑运算符主要有:and、or、not三种。and和or操作符只有当需要计算第二个操作数的时候才会去执行计算,即假如第一个操作数满足了其运算条件,就不会去执行运算第二个操作数。
and运算符的返回结果:返回第一个操作数如果其为false,否则返回第二个操作数;or运算符的返回结果:返回第一个操作数如果其不为false,否则返回第二个操作数。因此可以据此实现Lua的三目运算符:(a and b) or c.这里假定b不为false的。
(a and b) or c
--()高运算优先级,所以先运算a and b
a and b
--and操作符,假如a为false,则返回a,否则返回b,首先假定a为false
a and b -- return a
--执行到第二步:or操作符
a or c
--or操作符,假如a不为false,则返回a,否则返回c,因为已假定a为false,因此这里返回c
a or c -- return c
对比C/C++的三目运算符:a?b:c
a ? b : c
//三目运算符:如果a为真,则返回b,否则返回c
//同lua版本的操作,假定a为false,则此时三目运算符返回c,与lua版本的返回结果一致
因此lua版本的三目操作符也有同样的使用效果,只是要注意的是以:需要以and 的第二个操作符b不为false为前提条件。
3.4 连接操作符(Concatenation)
以两个点号".."为连接操作符,其操作数可以是string也可以是number,如果操作数是number,那么lua会将其转换为string类型。另外需要注意的是,连接符两边要以空格隔开。如:"a" .. "b".
3.5 长度运算符(The Length Operator)
操作符:#,其操作数必须为string类型或者table类型。
a = {1,nil,1,1}
print(#a) --4
a = {1,nil,1,1,nil}
print(#a) --1
第一次打印出来table的长度是4,而第二次打印出来的为1,因此#操作符在table中有nil值的时候需要特别注意其计算长度值。
3.6 Lua中运算符的运算优先级(Precedence)
自上至下,由高到低
^
not #-(负号)
*/%
+-
..好
<><=>=~= ==
and
or
所有的二元操作符除了"^"、".."是右结合律,其余都是左结合律。
3.7 Table Constructors
用来创建和初始化一个table。
创建并初始化一个空的table:a = {}
创建并初始化一个有元素的table:a = {"a","b","c"},访问其内容:a[1] = "a"(table的index从1开始)
针对一个已存在的table执行增加和删除元素的操作:
a = {x = 10}
a.y = 20 --add
print(a.y) --20
a.y = nil --remove
print(a.y) --nil
Table相对复杂的却又灵活的初始化及使用方法:
a = { aStr = "a", --a.aStr调用
bStr = "b",
{aStr = "a"}, --a[1]调用这个table
{bStr = "b"}
}
print("a.aStr",a.aStr)
print("type(a[1])",type(a[1]))
print("a[1].aStr",a[1].aStr)
由上可以感受到假如能熟练的使用table,那么用lua能编写出多么复杂的程序。再来一个例子:
--more general format 用表达式作为index
opnames = {["+"] = "add",["-"] = "sub",["*"] = "mul",["/"] = "div"}</span>
<span style="font-size:18px;">print(opnames[s]) --sub</span>
<span style="font-size:18px;">s = "-"
i = 20
a = {[i+0] = s,[i+1] = s .. s,[i+2] = s .. s .. s}
print("a[22]",a[22]) -- --
真心觉得Lua灰常的强大啊~!~!@#¥%……