zoukankan      html  css  js  c++  java
  • 《Programming in Lua 3》读书笔记(四)

    关于Lua的表达式涵盖:数字常量,字符串,变量,一元和二元操作符,还有函数的调用。

    3.1 算术运算符(Arithmetic Operators)

    Lua中的算术运算符包括:+、-、*、/、^(幂运算)、%(模运算)、-(负数)这七种操作符。要求操作数必须为实数。书中提到的模运算的定义:

    a % b = a - math.floor(a/b)*b

    操作数的不同会影响到结果的类型。当操作数是整数的时候,操作符返回的结果类型与第二个操作数的类型保持一致;而当操作数是实数的时候,返回结果就会有所差异。借鉴书中的例子:

    x = 1.11
    x % 1   --返回的是x的小数部分
    print(x % 1)   -- 0.11

    根据这一特性,执行x - x%1操作时就可以得到其整数部分。当我们想保留某个数的小数点后几位时,可以执行以下操作:

    x = 1.111111
    --保留后两位
    print(x - x% 0.01)    --1.11
    --保留后三位
    print(x - x % 0.001)  --1.111

    3.2 关系运算符(Relational Operators)

    Lua中的关系运算符主要有:<、>、<=、>=、==、~=(不等于),关系运算符的操作结果是布尔值。

    Lua中关于table和userdata的关系运算:因为lua是以引用的方式去比较table和userdata,因此只有当这两个类型变量完全一样时才会相等,如下:

    a = {};a.x = 1;a.y = 0
    b = {};b.x = 1;b.y = 0
    c = a
    -- c == a ; a ~= b
    print(a == b)     --false
    print(a == c)     --true

    要注意的不同类型的变量进行比较的时候,其结果可能会不同:2<15 但是"2">"15"


    3.3 逻辑运算符(Logical Operators)

    Lua中的逻辑运算符主要有:and、or、not三种。and和or操作符只有当需要计算第二个操作数的时候才会去执行计算,即假如第一个操作数满足了其运算条件,就不会去执行运算第二个操作数。

    and运算符的返回结果:返回第一个操作数如果其为false,否则返回第二个操作数;or运算符的返回结果:返回第一个操作数如果其不为false,否则返回第二个操作数。因此可以据此实现Lua的三目运算符:(a and b) or c.这里假定b不为false的。

    (a and b) or c
    --()高运算优先级,所以先运算a and b
    a and b
    --and操作符,假如a为false,则返回a,否则返回b,首先假定a为false
    a and b -- return a
    --执行到第二步:or操作符
    a or c
    --or操作符,假如a不为false,则返回a,否则返回c,因为已假定a为false,因此这里返回c
    a or c    -- return c

    对比C/C++的三目运算符:a?b:c

    a ? b : c
    //三目运算符:如果a为真,则返回b,否则返回c
    //同lua版本的操作,假定a为false,则此时三目运算符返回c,与lua版本的返回结果一致

    因此lua版本的三目操作符也有同样的使用效果,只是要注意的是以:需要以and 的第二个操作符b不为false为前提条件。


    3.4 连接操作符(Concatenation)

    以两个点号".."为连接操作符,其操作数可以是string也可以是number,如果操作数是number,那么lua会将其转换为string类型。另外需要注意的是,连接符两边要以空格隔开。如:"a" .. "b".


    3.5 长度运算符(The Length Operator)

    操作符:#,其操作数必须为string类型或者table类型。

    a = {1,nil,1,1}
    print(#a)     --4
    a = {1,nil,1,1,nil}
    print(#a)     --1

    第一次打印出来table的长度是4,而第二次打印出来的为1,因此#操作符在table中有nil值的时候需要特别注意其计算长度值。


    3.6 Lua中运算符的运算优先级(Precedence)

    自上至下,由高到低

    ^

    not #-(负号)

    */%

    +-

    ..好

    <><=>=~= ==

    and

    or

    所有的二元操作符除了"^"、".."是右结合律,其余都是左结合律。


    3.7 Table Constructors

    用来创建和初始化一个table。

    创建并初始化一个空的table:a = {}

    创建并初始化一个有元素的table:a = {"a","b","c"},访问其内容:a[1] = "a"(table的index从1开始)

    针对一个已存在的table执行增加和删除元素的操作:

    a = {x = 10}
    a.y = 20     --add
    print(a.y)    --20
    a.y = nil     --remove
    print(a.y)    --nil

    Table相对复杂的却又灵活的初始化及使用方法:

    a = {   aStr = "a",        --a.aStr调用
    	bStr = "b",
    	{aStr = "a"},      --a[1]调用这个table
    	{bStr = "b"}
    }
    print("a.aStr",a.aStr)
    print("type(a[1])",type(a[1]))
    print("a[1].aStr",a[1].aStr)

    由上可以感受到假如能熟练的使用table,那么用lua能编写出多么复杂的程序。再来一个例子:

    --more general format 用表达式作为index
    opnames = {["+"] = "add",["-"] = "sub",["*"] = "mul",["/"] = "div"}</span>
    <span style="font-size:18px;">print(opnames[s])   --sub</span>
    <span style="font-size:18px;">s = "-"
    i = 20
    a = {[i+0] = s,[i+1] = s .. s,[i+2] = s .. s .. s}
    print("a[22]",a[22])     -- --

    真心觉得Lua灰常的强大啊~!~!@#¥%……

  • 相关阅读:
    memory runs at single channel问题解决
    ASP php获取文件URL地址等方法
    zencart的modules下数据库操作templates排版和common首页引用
    php生成html 伪静态??
    Linux服务器自动备份压缩MySQL数据库的实用方法
    dos 命令集
    Zencart 500错误查找和解决方法
    破解JS加密:url unicode加密而已
    .htaccess 保护文件夹
    TCP 的那些事儿(上)
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044586.html
Copyright © 2011-2022 走看看