当前位置:   article > 正文

(3)LUA程序设计-表达式与语句(expression & statement)_lua逻辑表达式怎么单独成句

lua逻辑表达式怎么单独成句

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/658176
推荐阅读
相关标签
  

闽ICP备14008679号