算术操作符

Lua支持常规的算术操作符有:+ , - ,* / ^(指数) %(取模)

关系操作符

< > <= >= == ~=

所有这些操作符的运算结果都是true或者false

==和~=用于比较任意两个值,如果这两个值具有不同的类型,Lua就认为他们是不相等的。特别注意i:nil至于其自身相等。

对于table,userdata和函数,Lua是作引用比较的。也就是说,只有当他们引用同一个对象时,才认为它们相等。
例如:一下代码

a={}; a.x=1; a.y = 0
b={}; b.x=1; b.y = 0
c=a;

其结果是:a==c 但 a~=b

 

逻辑操作符

逻辑操作符有:and,or not, 所有的逻辑操作符将 false 和 nil 视为假,而将其他任何东西视为真。

对于and来说,如果他的第一个操作符是假,就返回第一个操作数;不然返回第二个操作数。
对于操作符 or 来说,如果它的第一个操作符为真,就返回第一个操作数,不然返回第二个操作数。

print( 4 and 5) --->5
print( nil and 13) ---> nil
print( false and 13)--->false
print( 4 or 5 ) ---->4
print(false or 5) --->5

and 和 or 都是使用“短路求值”

有一种常用的Lua习惯写法“x=x or v" ,他等价于:
if not x then x=v end
===> x= x or v
另外还有一种习惯写法:“(a and b) or c ”,这类似于C语言中的表达式 a ? b : c, 但前提是b不为假。例如选出数字x,y中的较大者
可以使用下面的哦语句: max=(x>y) and x or y

3.4 字符串连接:

可以使用“..”,如果其任意一个操作数是数字的话,Lua会将这个数字转换成一个字符串:
print("hello" .. "world") ---> hello world
print(0 .. 1) ---> 01

注意:Lua中的字符串是不可变的值,连接操作符只会创建一个新字符串,而不会对其原操作数进行任何修改:
a="hello"
print(a .. "world") ---> hello world
print(a) ---> hello

3.5 优先级

3.6 table构造式

days={"Sunday" , "Monday" , "Tuesday" , " wednesday" , " Thursday" , " Friday", " Saturday"}

days[1]=Sunday 和数组有区别:下标从1开始

a={x=10, y=20} ===> a.x=10; a.y=20

删除字段时直接:赋值nil就行了

3.7 Lua中的链表

list=nil
for line in io.lines() do
list = {next=list,value=line}
end
这段代码从标准输入中读取每行的内容,然后将每行按相反的次序存储到一个链表中。
链表的每个节点都是一个table,table中含有两个字段,value(每行的内容) 和 next( 指向下一个节点的引用)

一下代码遍历了该链表,并打印了其内容
local l=list
while l do
print(l.value)
l=l.next
end

真正的Lua程序中很少会用到链表。

第四章:语句

4.1 赋值
Lua 允许“多重赋值”,也就是一下子将多个值赋予多个变量。每个值或每个变量之间以逗号分隔,例如:
a,b=10,2*x
Lua总是会将等号右边值的个数调整到与左边变量的个数相一致。规则是:若值的个数少于变量的个数,那么多与的变量会被赋予nil
若值的个数更多的话,那么多余的值会被“静悄悄”丢掉:
a,b,c=0,1
4.2 局部变量与块
j=10 --全局变量
local i=1 --局部变量
“尽可能地使用局部变量”是一种良好的编程风格。访问局部变量比访问全局变量更快,也便于垃圾收集器可以释放其值

所有声明的局部变量的作用于从声明语句开始,直至所在快的结尾。

在需要时才声明变量,可以使这个变量在初始化时刻就拥有一个有意义的初值。此外,缩短变量的作用域,有助于提高代码的可读性

4.3 控制结构
if,for,while以end作为结尾,repeat 以 until 作为结尾
控制结构中的条件表达式可以是任何值,Lua将所有不是false和nil的值视为“真”。

if op=="+" then r=a+b
elseif op=="-" then r=a-b
elseif op=="*" then r=a*b
elseif op=="/" then r=a/b
else
error("invalid operation")
end

-----------------------
Lua不支持switch语句

2) local i=1
while a[i] do
print(a[i])
i=i+1
end

3)
repeat 一条reapeat-until 语句重复执行其循环体直到条件为真时结束。测试是在循环体之后做的,因此循环体至少会执行一次
--打印输入的第一行不为空的内容
repeat
lin=io.read()
until line~=""
print(line)

与其他大多数语言不同的是,在Lua中,一个声明在循环体中的局部变量的作用域包括了条件测试
local sqr=x/2
repeat
sqr=(sqr+x/sqr)/2
local error=math.abs(sqr^2-x)
until error < x/10000 ----在此仍可以访问error

4.3.4 数字型 for

  for 语句有两种那个形式:数字型for和泛型 for 

  数字型for的语法如下:

    for var = exp1, exp2,exp3 do

      .....

    end

    var从exp1变化到exp2,每次变化都以exp3作为步长递增var,并执行一次“执行体”。第三个表达式exp3是可选的,如不制定的话

    lua会将步长默认为1.一下是这种循环的一个典型示例:

      for i=1,f(x) do print(i) end

      for i=10,1,-1 do print(i) end

      如果不想给循环设置上限的话,可以使用常量math.huge:

      for i=1,math.huge do

        if(0.3*i^3-20*i^2-500>=0) then 

          print(i)

          break;

        end

      end

      for语句的变量是局部变量,并且尽在循环体内可见

      for i=1,10 do print(i) end

      max=i ---可能是错误的!这里访问的是一个全局的i

      不要在循环过程中修改控制变量的值,否则会导致不可预知的小错,如果想在for循环正常结束前终止循环,可以向上里中

      那样使用break语句。

4.3.5 泛型for

  泛型for循环通过一个迭代器函数来遍历所有值:

    for i,v in ipairs(a) do.print(v) end

  Lua的基础库提供了ipairs,这是一个用于便利数组的迭代器函数。每次循环中,i会被赋予一个索引值,同时v被赋予一个对应于该索引的数组元素值。示例:演示了如何遍历一个table中所有的key

    ----打印table t中所有的key

    for k in pairs(t) do print(k) end 

  标准可提供了几种迭代器,包括用于迭代文件中每行的(io.lines), 迭代 table 元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的(string.gmatch)等。

 

4.4 break 和 return 语句用于跳出当前的块

  break 语句用于结束一个循环,他只会跳出包含他的那个内部循环(for ,repeat 或while),而不会改变外层的循环。在执行了break后,程序会在哪个被跳出的循环之后继续执行。

  return 语句用于从一个函数中返回结果,或者用于简单地结束一个函数的执行。任何函数的结尾处都有一句隐士的return。所以如果有一个函数,他没有值需要返回,那么就无须在其结尾处添加return语句。

  由于语法构造的原因,break或return只能是一个块的最后一条语句。换句话说,它们应是程序块的最后一条语句,或者是end,else或until前的一条语句。例如:下示例中的break就是then块的最后一条语句

 

local i =1 
  while a[i] do 
    if a[i] == v then break end
    i=i+1
  end