第三课 表达式

来源:互联网 发布:淘宝用卷怎么用 编辑:程序博客网 时间:2024/06/05 12:07
Lua中的表达式中可以包含数字常量、字面字符串、变量、一元和二元操作符及函数调用。还可以包括函数定义和table 构造式。

算术操作符
二元:+、-、*、/、^(指数)、%(取模,Lua5.1新增)
一元:-(负号)
如:x^0.5 --x的平方根
x^(-1/3) --x立方根的倒数
取模操作是根据以下规则定义的:
a % b == a - floor(a / b) * b
对于整数来说,以上算式通常都是有意义的,计算结果的符号永远与第二个参数相同。
对于实数而言,可能有其他用途。
例如:
x % 1的结果就是x的小数部分
x - x % 1的结果就是x的整数部分
x - x % 0.01是x精确到小数点后两位的结果
x = math.pi
print(x - x % 0.01) -->3.14

关系操作符
< 、>、<=、>=、==、~=
以上操作符的运算结果都是true或者false
nil只与其自身相等
对于table、userdata和函数,Lua是作引用比较的。只有当它们引用同一个对象时,才认为它们相等。
a = {}; a.x = 1; a.y = 0
b = {}; b.x = 1; b.y = 0
c = a
则:c == a,但是b ~= a
Lua只能对两个数字或两个字符串进行大小性比较
其他情况只能进行相等或不相等比较

逻辑操作符
and、or、not
所有逻辑操作只将nil和false视为假,其他情况全部为真
a and b ==a为假就返回a,否则返回b
a or b ==a为真就返回a,否则返回b
and和or都是使用“短路求值”,只会在 需要时才去评估第二个操作数
Lua习惯写法
x = x or v ==当x值为false时赋默认值
(a and b) or c ==等价与C语言中的条件表达式a?b:c,前提是b必须为真

字符串连接(..操作符)
如果其中任意一个操作数是数字的话,Lua会将这个数字转换成一个字符串:
print(0 .. 1) -->01

优先级
^ (右结合)
not # -(一元)
* / %
+ -
.. (右结合)
< > <= >= ~= ==
and
or

table构造式
构造式是用于创建和初始化table的表达式。这是Lua特有的一种表达式,也是Lua中最有用、最通用的机制之一。
最简单构造式 {},用于创建一个空table
days = {" Sunday", "Monday", " Tuesday", " Wednesday", "Thursday", "Friday", " Saturday"} ==days[1] = "Sunday"
提供一种特殊语法来初始化记录风格的table
a = {x = 1, y = 2} == a = {}; a.x = 1; a.y = 2

将记录风格的初始化和列表风格的初始化混合在一个构造式中使用:
polyline = {color = "blue", thickness = 2, npoints = 4,
{x = 0, y = 1},
{x = 1, y = 2},
{x = 3, y = 4},
{x = 5, y = 6},
}

print(polyline[2].x) -->1
print(polyline[4].x) -->5
更为通用的初始化格式,允许在方括号之间,显示地用一个表达式来初始化索引值:
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[22]) -->"---"
无论列表风格还是记录风格的初始化,其实都是这种通用语法的特例。
{x = 0, y = 1} == {["x"] = 0, ["y"] = 1}
{"r", "g", "b"} == {[1] = "r", [2] = "g", [3] = "b"}
在最后一个元素后面写一个逗号,是合法的,对于那些生成Lua table的程序来说,就没有必要将最后一个元素做特殊处理了。
a = {["1"] = "red", ["2"] = "green", ["3"] = "blue",}
还可以使用分号来代替逗号,通常会将分号用于分割构造式中不同成分,例如将列表部分和记录部分明显地区分开:
a = {x = 1, y = 2; "one", "two", "three"}



































0 0
原创粉丝点击