《Programming in Lua 3》读书笔记(四)

关于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灰常的强大啊~!~!@#¥%……

原文地址:https://www.cnblogs.com/zhong-dev/p/4044586.html