lua的表达式

| 分类 lua  | 标签 lua 

本文为xiedantibu在学习lua程序设计的笔记 ,转载请注明作者及出处! ###目录 —-     前言
    算术操作符
    关系操作符
    逻辑操作符
    字符串连接
    优先级
    table构造式


####前言 — 表达式用于表示值,Lua的表达式中可以包含数字常量、字面字符串、变量、一元和二元操作符以及函数调用、有别于其他语言,表达式中还可以包括函数定义和table构造式。


####算术操作符 — Lua支持常规的算术操作符有:二元的”+”(加法),”-“(减法),”x”(乘法),”/”(除法),”^”(指数),”%”(取模),一元的”-“(负号)。所有的这些操作符都用于实数。例如:x^0.5将计算x的平方根,x^(-1/3)将计算x立方根的倒数。
取模操作符是根据以下规则定义的: a%b==a-floor(a/b)*b

a=3-math.floor(3/(-1.2))*(-1.2) -->math.floor()方法求一个最接近它的整数,它的值小于或等于这个浮点数。
print(a)        --> (-0.6)
print(3%-1.2)   --> (-0.6)
print(-3%1.2)   --> 0.6 计算结果的符号永远与第二个参数相同

x%1的结果就是x的小数部分,而x-x%1的结果就是其整数部分。x-x%0.01则是x精确到小数点后两位的结果。类似的表达式angle%(2*math.pi)就是将任意角度规范化为区间[0,2π]


####关系操作符

Lua提供的关系操作符有:”<” ”>” ”<=” ”>=” ”==” ”~=”所有这些操作符的运算结果都是true或false。
操作符==用于相等性测试,操作符~=用于不等性测试。这两个操作符可以应用于任意两个值。如果两个值具有不同的类型,Lua就认为它们是不相等的;nil只与其自身相等。
对于table、userdata和函数,Lua是作引用比较的。也就是说,只有当它们引用同一个对象时,才认为它们相等。
为了避免类型不一致的比较,Lua在遇到字符串和数字的大小比较时会引发一个错误,如2 < "15"就会导致这种错误。


####逻辑操作符 — Lua提供的逻辑操作符有and、or和not。与条件控制语句一样,所有的逻辑操作符将false和nil视为假,而将其它的任何东西视为真。对于操作符and来说,如果它的第一个操作数为假,就返回第一个操作数;不然就返回第二个操作数。对于操作符or来说,如果它的第一个操作数为真,就返回第一个操作数;不然就返回第二个操作数。
对了这里要说明下,Lua的and以及or逻辑操作符并不是返回true或false,而是返回操作数的值。对于not操作符则永远只返回true或者false

======and 以及 or操作符===========
print(4 and 5)     -->5
print(nil and 13)  -->nil
print(false and 13) -->false
print(4 or 5)      -->4
print(false or 5)  -->5

======not操作符===========
print(not nil)     -->true
print(not false)	-->true
print(not 0)	-->false
print(not not nil)	-->false

and和or都使用”短路求值”,也就是说,它们只会在需要时候才去评估第二个操作数。

有一种常用的lua习惯写法x = x or v,其等价于:if not x then x = v end 它可用在没有设置x的时候(既对 x的求值结果为假时),将其设置为一个默认值v。

还有一种习惯写法是a and b or c,这类似于C语言中的表达式a ? b : c,但前提是b不为假。例如,为了选出数字x和y中的较大者,可使用以下语句:max=(x>y) and x or y


####字符串连接 — 关于字符串连接在上文中,我们就在代码中碰到,这里说明下,在Lua中连接两个字符串,可以使用操作符” .. “(两个点,左右两边都有一个空格)。如果其任意一个操作数是数字的话,Lua会将这个数字转换成一个字符串。Lua中字符串是不可变的值,连接操作符只会创建一个新字符串,而不会对其原操作数进行任何修改。

a="hello"
print(a .. " world ")   -->hello world
print(a)				-->hello

####优先级 — Lua操作符优先级如下图(从高到低):
image
在二元操作符中,除了指数操作符”^”和连接操作符”..”是”右结合”的,所以其他操作符都是”左结合”


####table构造式 — 构造式是用于创建和初始化table的表达式。这是Lua中特有的一种表达式,并且也是Lua中最有用、最通用的机制之一。
最简单的构造式就是一个空构造式{},用于创建一个空table。构造式还可以用于初始化数组,数组的下标从1开始。

days={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
print(days[1])  -->Sunday
print(days[4])	-->Wednesday

Lua还提供了一种特殊的语法用于初始化记录风格table:

local a = {x=10,y=30}
print(a.x)	-->10
print(a["y"])	-->30 以上两种风格的构造式各有其限制。如,不能使用负数的索引,也不能用运算符作为记录的字段名。  下面介绍一款更通用的格式:  

opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}
i=20;
s="-"
a={[i+0] = s, [i+1] = s..s,[i+2]=s..s..s}
print(opnames[s])      --> sub
print(a[21])		   --> -- 这种语法看起来很繁琐,但是很灵活。无论是列表风格的初始化,还是记录风格的初始化,都是这种通用语法特例。构造式`{x=0,y=0}`等价于`{["x"]=0,["y"]=0}`。构造式`{"r","g","b"}`等价于`{[1]="r",[2]="g",[3]="b"}`

####END

青春是一场大雨,即使感冒了,还盼回头再淋一次...image...微笑永远是一个人身上最好看的东西...


PREVIOUS     NEXT