`
avenje
  • 浏览: 13078 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

(3)LUA程序设计-表达式与语句(expression & statement)

 
阅读更多

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,加入请注明来源。

 

 

 

梦之幻时尚睡衣纺 http://shop.paipai.com/442560143

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics