Lua的表达式中可以包含数字常量、字面字符串、变量、一元和二元操作符及函数调用。表达式中还可以包括函数定义和table构造式。

1. 算数操作符1.1 二元算数操作符

+加-减*乘/除^指数%取模

加减乘除不必多说,与其他编程语言相同。在lua中可以用^计算指数:

print(4^2)--16print(4^1/2)--2

%用于取模,和其他语言并没有不同。在lua中可以使用如下方式决定保留几位小数:

num=math.pi--3.1415926535898print(num-num%1)--3整数部分print(num-num%0.01)--3.14保留两位小数print(num-num%1e-N)--保留N位小数,N为非负整数

以这种方式保留小数不会出现进位的情况(即“五入”)。在其他语言中也可以使用这种方式,只是由于单精度浮点数存在四舍五入的问题,可能会造成一些误差。在JavaScriptpython中,

num=3.1415926535898//JavaScriptnum.toFixed(N)//保留N位小数,N为非负整数,默认N=0,自动四舍五入Math.round(num*1e+N)/1e+N//保留N位小数,N为非负整数,自动四舍五入#pythonround(num,N)#保留N位小数,N为非负整数,默认N=0,自动四舍五入"%.Nf"%num#保留N位小数,N为非负整数,自动四舍五入

另外,在lua中没有C/C++/Java/JavaScript/Python中的

+=-=*=/+%=

运算符,在编码时需留意。

1.2 一元算数操作符

-负号2. 关系操作符

lua中有以下关系操作符,用来进行比较操作:

<小于>大于<=小于等于>=大于等于==等于~=不等于

所有比较操作的结果都是true或false。需要注意以下几点:

和其他大多数编程语言不同,不等于比较符为~=,而不是!=

nil只与其自身相等;

lua在比较操作时不会做自动转型,类型不同的两个值永远不等。在遇到string和number比较时,lua会抛出错误;

table/function/userdata三种类型是做引用比较的,即a = {} a.x = 1 b = {} b.x = 1 print(a == b) -- false

3. 逻辑操作符

python完全相同,lua使用如下保留字作为逻辑操作符:

and与or或not非

关于运算符要注意一下几点:

在Lua(一)——类型与值我们就提到过,lua只将false和nil视为假,其他任何值包括0与空字符串都视为真;

lua中的and/or为短路与和短路或,所谓短路,是指一旦逻辑判断结果已定时不会继续向后做判断,这样带来的好处是在遇到type(v) == "table" and v.tag="h2"这样的表达式时不会导致运行错误;

python相同,lua中没有C/Java/JavaScript中的三目运算符(max = a > b ? a : b),如想达到三目运算符的效果,通过如下方式实现即可:

#pythonmax=aifa>belseb--luamax=(a>b)andaorb--此情况下a必须为真,否则实现不了三目运算符的功能ifa>bthenmax=aelsemax=bend4. 操作符优先级

这里我们没有列出操作符的优先级,也不建议去刻意记忆该优先级,任何情况下都建议使用()解决优先级问题,既不会出错,又能提高代码的可读性。

5. table构造式

同样,在Lua(一)——类型与值我们就提到过lua中table类型的初始化及赋值方法,但初始化及赋值table远不止一种方式,以下方式均是合法、正确的:

tableBlank={}tableBlank.hobbies={"basketball","ping-pong","volleyball"}tableBlank["school"]="BIT"tableBlank[-100]=-100--这种方式可以使用负数/特殊符号作为keytableBlank["+"]="add"print(tableBlank.hobbies[1])--basketballprint(tableBlank[-100])---100print(tableBlank["+"])--addtableWeek={"Sunday","Monday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}fori=1,#tableWeekdoprint(tableWeek[i])end--[[SundayMonday...Saturday--]]tableMixed={name="Tom",sex="male",age=20,176,64.5,[0]="zero"}print(tableMixed.name)--Tomprint(tableMixed.sex)--maleprint(tableMixed[1])--176print(tableMixed[0])--zero

除了初始化及赋值,关于table还有两个类似“语法糖”知识点:

在table构造式的最后一个元素后写逗号是合法、正确的,如tableDot = {[1]="red", [2]="green",}。这对于要生成table的lua程序来说很灵活,无需区别对待最后一个元素;

在table构造式中可以使用;来代替,,两者作用完全等同,如tableSymbol = {name="Lucy";sex="male",age=20}

和函数相关的内容我们放到之后的博客中进行讲解,敬请关注。

完。