赞
踩
1.表达式
lua的表达式,一般由数字/字符串常量,一元/二元运算符,函数调用构成,除此外,lua表达式当中还可以有函数定义和table构造式
1.1算术运算符
一目运算符只有-负号,二元运算符有+ - * / %加减乘除求余,在这里特别说明一下求余运算,规则如下
a%b = a - floor(a/b)*b
对于整数求余,表达式结果符号与b一致;对于实数而言,如x%1表示x的小数部分;x%0.1表示保留x的小数点一位之后的值(如3.123%0.1 = 0.023);x%0.01表示保留x小数点两位之后的值(如3.123%0.01 = 0.003)
1.2关系操作符
> < <= >= == ~= 操作结果只有true/false两种值;
只有类型相等的两个值,才有可能==,nil只有与自身相等,其他一律不相等
function/userdata/table只有引用相等时,才相等,否则不相等,下面举table为例
a = {} a.x = 0 a.y = 0
b = {} b.x = 0 b.y =0
c = a
print(a==b) -->false
print(c==a) -->true
lua中两个字符串的比较,像C语言一样逐位比较,如"abcd" <"dbcd"
区别: 0与“0”,由于不同类型,所以~=
我们都知道12<15为true,但是'12'<'15'则为false,原因上面已经说了。
1.3逻辑操作符
and or not与或非
逻辑操作符将false与nil视为假,其他一律视为真
lua的逻辑运算与其他语方的逻辑运算不一样,在明确知道逻辑运算的结果的情况下,该逻辑运算表达式将以其中一个操作数作为结果,规则如下
a and b --a,b为两个表达式,a为假,刚逻辑表达式结果肯定为假,此时,整个表达式的结果为a,否则为b
a or b --a,b 同上,a为真的时候,这个表达式结果肯定为真,此时返回a作为表达式结果,否则返回b
技巧:1.if not x then x = v end <==> x = x or v(与javascript语法一样)
2. x > y ?x :y <==> (x>y) and x or y
not 很简单,取反即可。
1.4 字符串连接符与表达式运算的优先级问题
在(1)当中,我们简单谈到字符串连接符..的使用,在这里只需要记住,在lua当中,字符串是不可变的即可
关于运算优先级的问题,几乎在所有的编程语言当中都提及到了,下面简扼谈一下
^ --指数运算
not # --一元
* / %
+ -
..
< > <= >= ~= ==
and
or
上面优先级从上而下,越上优先级别越高;关于结合性问题,除了指数操作符,字符串连接符是右结合外,其他都是左结合。
1.5 table构造式
空构造式{}
类似数组形式的构造式days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat"} --索引值从1开始,如print(days[5])-->Fri
类似于记录风格的构造式 ta = {x = 10,y = "fuck you"} 等价于 ta = {} ta.x = 10,ta.y = "fuck you"
无论用何种形式构造table,都可以在创建table之后,再为table 添加新条目,举例
av = {x = 'cjk',y = 'sdf' ,label = 'fuck you' }
av2 = {math.sin(0),stirng.gsub('fuck you','you','him')}
av[1] = 'xzmly' --为av添加新条目key = 1 value = 'xzmly'
av2.f = av --为av2添加新条目,key = 'f',value=av(av为一个table)
再举例,从标准输入读取每一行内容,放到一个由table构建的链表当中
list = nil
for line in io.lines() do
list = {next = list ,value = line} --创建一个表,用于存放读入的行内容,同时添加一个指向下一节点的条目next
end
读取每一行内容
local l = list --定义局部变量l,用于指向连表头list
while l do
print(l.value) --打印每一行内容
l = l.next --指向下一个节点
end
说明:1.当记录与列表table混合在同一个table当中时,举例如下
t={ x = 1,y =2 ,{a=11,b=11},{a=22,b=22},{a =33,b=33}}
时,t[1]表示一条记录,如t[1]表示{a=11,b=11},t[2]表示{a=22,b=22},t[3]表示{a=33,b=33},
2.记录/列表table各有限制,不能用负数索引,不能用运算符当索引,但可以显示将运算符加上引号,再加上方括号构成的的字符串作为索引,如下
operates = {['+'] ='add',['-']= 'sub',['*']= 'mul',['/']= 'div'}
3.有时候可以让table从0开始索引,以前面的days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat"}表为例
只需修改成days = {[0]="Sun","Mon","Tue","Wen","Thu","Fri","Sat"},‘Mon’从1开始索引,其他递增
4.可以在table的最后添加一个逗号,这是lua所允许的,形如
days = {"Sun","Mon","Tue","Wen","Thu","Fri","Sat",}
2.语句
2.1赋值
多重赋值
x=1 y = 2
x,y = y,x --交换x,y的值
print(x,y) -->2 1
a,b,c = 1
print(a,b,c)-->1 nil nil
a,b,c = 1,2
print(a,b,c)-->1 2 nil
a,b,c = 1,2,3
print(a,b,c) -->1,2,3
a,b,c = 1,2,3,4
print(a,b,c)-->1,2,3 4被舍弃
总结:少补nil,多舍弃原则
后面还会讲到函数,lua支持多值返回的函数,如a,b = f();f返回值分别赋值给a,b
2.2局部变量与块
所谓块,可以是一个控制体内,可以是函数体内,也可以是一个程序块,定义局部变量只需要在变量前加local即可
x = 10 --global variable
local y = 1;----local variable
特别需要注意的是,
1。当在控制体内与操作体外出现同名变量,外部是全局变量,循环体内是局部变量的时候,局部变量会屏蔽全局变量,而循环体条件内的变量引用的是全局变量,例如下
x = 10
local i = 1
while i<x do --x为全局变量x = 10 位置1
local x = i*2 --声明x局部变量,此时x = 2,4,6,8...屏蔽外面全局变量 位置2
end
2。当在上例中的位置1,2之间添加一条打印,打印x的值的时候
x = 10
local i = 1
while i<x do --x为全局变量x = 10 位置1
print(x) -->10
local x = i*2 --声明x局部变量,此时x = 2,4,6,8...屏蔽外面全局变量 位置2
end
会打印出全局变量的值。
2.3控制结构
简单的罗列一下控制结构
----IF-----------------------
if ...then..end
if ... then ...else...end
if ... then ...else if ...then....else if...then....else....end
-----WHILE---------------------------------------
while ... do ....end
repeat ... until ....
---------FOR 数字型/泛型------------------------------------------
数字型FOR for var = e1,e2,step do .... end --e1,e2表示初始,终止值,step表示步长,默认值为1,可选
泛型FOR 通过迭代器来遍历所有值的,形如 for index,value in ipairs(a) do print(v) end,后面将详细讲不同的迭代器的构建
-------------return & break----简单,不举例了--------------------------------------------------------
下一节,将讲解LUA的函数,以及对函数的深入理解!!(4)LUA程序设计-函数及深入理解(function)
LUA技术交流群,请加Q群:139315537,加入请注明来源。
(1)LUA程序设计-开篇(beginning)(2012-07-28 00:47) (2)LUA程序设计-类型与值(type & value)(2012-07-28 23:12)
|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。