循环与选择

Lua提供以下类型的循环来处理循环需求。

编号

循环类型

描述

1

while循环

在给定条件为真时重复语句或语句组,它在执行循环体之前测试条件。

2

for循环

多次执行一系列语句,并缩写管理循环变量的代码。

3

repeat…unti循环

重复语句组的操作,直到满足until条件。

4

嵌套循环

可在任何循环中使用另一个或多个循环,如:while,fordo..while循环。

循环控制声明

循环控制语句从正常顺序改变执行。 当执行离开作用域时,将销毁在该作用域中创建的所有自动对象。

Lua支持以下控制语句。

编号

控制语句

描述

1

break语句

终止循环并将执行转移到循环或switch之后的语句。

无限循环

如果条件永远不会变为假,则循环变为无限循环。 while循环通常用于此目的。如果直接给出了一个条件为真,它就会永远执行。可以使用break语句来打断这个无限循环。

while( true )do
   print("This loop will run forever.")end

 

Lua编程语言假定布尔truenon-nil值的任意组合为true,如果它是布尔falsenil,则假定为false值。 需要注意的是,在Lua中,零将被视为true

Lua编程语言提供以下类型的决策制定语句 -

编号

决策语句

描述

1

if语句

if语句由布尔表达式后跟一个或多个语句组成。

2

if…else语句

if语句后面可以跟一个可选的else语句,该语句在布尔表达式为false时执行。

3

嵌套if语句

在一个ifelse if语句中使用另一个ifelse if语句。

 

 

Lua中的控制结构

Lua提供了一组传统的、小巧的控制结构,包括用于条件执行的if,用于迭代的while、repeat和for。所有的控制结构都有意个显式的终止符:if、for和while以end作为结尾,repeat以until作为结尾。
1. if then else

if a < 0 then a = 0 end
if a < b then return a else return b end
if line > MAXLINES then
    showpage()
    line = 0end

 

若要编写嵌套的if,可以使用elseif。

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语句,所以这种一连串的if-else if代码很常见。

2. while
Lua先测试while的条件。如果条件为假,那么循环结束;不然,Lua执行循环体,并重复这一过程。

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

3. repeat
一条repeat-until语句重复执行其循环体直到条件为真时结束。测试是在循环体之后做的,因此循环体至少会执行一次。

-- 打印输入的第一行不为空的内容repeat
    line = io.read()until line ~= ""print (line)

与其他大多数语言不同的是,在Lua中,一个声明在循环体中的局部变量的作用于包括了条件测试:

local sqr = x/2repeat
    sqr = (sqr + x/sqr)/2
    local error = math.abs(sqr^2 - x)until error < x/10000       -- 在此仍可访问error

4. 数字型fornumeric for
for循环有两种形式:数字型for(numeric for)和泛型for(generic for)。
数字型for的语法如下:

for var=exp1,exp2,exp3 do
    <执行体>end

var从exp1变化到exp2,每次变化都以exp3作为步长(step)递增var,并执行一次“执行体”。第三个表达式exp3是可选的,若不指定的话,Lua会将步长默认为1。以下是这种循环的一个典型示例:

for i=1,f(x) do print(i) endfor 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

5.泛型forgeneric for
泛型for循环通过一个迭代器(iterator)函数来遍历所有值:

-- 打印数组a的所有值for i,v in ipairs(a) do print(v) end

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

-- 打印table t中所有的keyfor k in pairs(t) do print(k) end

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

 

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

   Lua 编程语言中 for语句有两大类:数值for循环,  泛型for循环

 

数值for循环

    for var=exp1,exp2,exp3 do 

        <执行体>  

    end 

 

    var从exp1变化到exp2,每次变化以exp3为步长递增var,并执行一次"执行体"。exp3是可选的,如果不指定,默认为1。

 

实例

    for i=1,f(x) do

        print(i)

    end

    

    for i=10,1,-1 do

        print(i)

    end

 

    for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。

 

   验证如下:

    #!/usr/local/bin/lua 

    function f(x) 

        print("function") 

        return x*2  

    end 

    for i=1,f(5) do print(i) 

    end

 

   以上实例输出结果为:

    function

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

 

 

泛型for循环

    泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句。Lua 编程语言中泛型for循环语法格式:

 

    --打印数组a的所有值 

    for i,v in ipairs(a)

        do print(v)

    end 

 

   i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

 

实例

    #!/usr/local/bin/lua 

    days = {"Suanday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 

    for i,v in ipairs(days) do  print(v) end 

 

    以上实例输出结果为:

    Suanday

    Monday

    Tuesday

    Wednesday

    Thursday

    Friday

    Saturday

 

posted @ 2019-06-02 13:51  gd_沐辰  阅读(288)  评论(0编辑  收藏  举报