2.7 控制语句

结构化程序设计中的控制语句有三种,即顺序、分支和循环语句,而且只能用这三种结构来完成。Lua程序通过控制语句来执行程序流,完成一定的任务。Lua中的控制语句有以下几类:

□ 分支语句:if

□ 循环语句:while、repeat、for

□ 与程序转移有关的跳转语句:break、return

2.7.1 分支语句

分支语句提供了一种控制机制,使得程序具有“判断能力”,能够像人类的大脑一样分析问题。分支语句又称条件语句,条件语句使部分程序可根据某些表达式的值有选择地执行。

由if语句引导的选择结构有if结构、if-else结构和elseif结构三种。

如果条件表达式为true就执行语句组,否则就执行if结构后面的语句。语句组是单句时大括号可以省略。语法结构:

      -- if结构
      if 条件表达式 then
              语句组
      end

      -- if…else结构
      if 条件表达式 then
          语句组 1
      else
          语句组 2
      end

      -- if-else结构
      if 条件表达式 1 then
          语句组 1
      elseif 条件表达式 2 then
          语句组 2
      elseif 条件表达式3 then
          语句组3
      …
      elseif 条件表达式n then
          语句组n
      else
          语句组n+1
      end

条件语句if-else示例代码如下:

      local score = 95

      print('------ if结构示例-------')
      if score > = 85 then
        print("您真优秀!")
      end

      if score < 60 then
        print("您需要加倍努力!")
      end

      if score > = 60 and score < 85 then
        print("您的成绩还可以,仍需继续努力!")
      end

      print('------ if-else结构示例------')
      if score < 60 then
        print("不及格")
      else
        print("及格")
      end

      print('------elseif结构示例------')

      local testscore = 76
      local grade
      if testscore> = 90 then
        grade = 'A'
      elseif testscore> = 80 then
        grade = 'B'
      elseif testscore> = 70 then
        grade = 'C'
      elseif testscore> = 60 then
        grade = 'D'
      else
        grade = 'F'
      end
      print("Grade ="..grade)

运行结果如下:

      ------ if结构示例-------
      您真优秀!
      ------ if-else结构示例------
      及格
      ------elseif结构示例------
      Grade = C

2.7.2 循环语句

循环语句使语句或代码块的执行得以重复进行。Lua支持三种循环构造类型:while、repeat和for循环是在执行循环体之前测试循环条件,而repeat是在执行完循环体之后测试循环条件。这就意味着for和while循环可能连一次循环体都未执行,而repeat将至少执行一次循环体。

1.while语句

while语句是一种先判断的循环结构,语句格式如下:

      [initialization]
      while termination do
        body
        [iteration]
       end

其中中括号([])可以省略,initialization是初始化语句,termination条件表达式。如果为true则执行循环体。iteration是迭代语句,主要用于改变循环变量。

下面的程序代码是通过while实现查找平方小于100000的最大整数:

      local i = 0

      while i * i < 100000 do
        i = i + 1
      end
      print(i .."*"..i .."="..i*i)

输出结果:

      317 * 317 = 100489

这段程序的目的是找到平方数小于100000的最大整数。使用while循环需要注意:while循环语句中只能写一个表示式,而且是一个布尔型表达式,如果循环体中需要循环变量,就必须在while语句之前做好处理。例如,上例中先给i赋值为0,其次在循环体内部,必须通过语句更改循环变量的值,否则将会发生死循环。

2.repeat语句

repeat语句的使用与while语句的使用相似,不过repeat语句事后判断的循环结构,语句格式如下:

      [initialization]
      repeat
        body
        [iteration]
      until termination

其中,termination条件表达式与while不同,termination为true则退出循环体。

下面程序代码是使用repeat实现了查找平方小于100000的最大整数:

      i = 0
      repeat
        i = i + 1
      until(i * i> = 100000)
      print(i .."*"..i .."="..i*i)

输出结果:

      317 * 317 = 100489

当程序执行到repeat语句时,首先无条件执行一次循环体,然后计算条件表达式,它的值必须是布尔型,如果值为false,则再次执行循环体,然后到条件表达式准备再次判断,如此反复,直到条件表达式的值为true时跳出循环。

3.典型for语句

典型for语句是应用最为广泛的一种循环语句,也是功能最强的一种。一般格式如下:

      for var=exp1, exp2, exp3 do
          body
      end

其中var是循环变量,从exp1开始起,直到exp2的值为止,步长为exp3。exp3可以省略,默认值为1。

下面的程序代码是使用典型for循环实现平方表:

      local i
      print("n n*n")
      print("---------")

      for i = 1,10 do
        print(i ..""..i * i)
      end

运行结果:

      n  n*n
      ------
      1   1
      2   4
      3   9
      4   16
      5   25
      6   36
      7   49
      8   64
      9   81
      10  100

这个程序步长为1,循环变量i的取值范围是大于等于1,小于等于10。因此,最后的结果是打印出1~10的平方。

4.迭代for-in语句

迭代for语句可以帮助我们方便地遍历数组(table类型)。一般格式如下:

      for i, v in ipairs(a) do
        body
      end

其中a是数组变量,ipairs函数从a数组中取出循环变量i和元素v。

下面是使用迭代for循环的示例代码:

      local numbers ={106, 22, 30, 48, 56, 60, 70, 80, 90, 109}

      for i, v in ipairs(numbers) do
        print(i ..":"..v)
      end

运行结果:

      1 :106
      2 :22
      3 :30
      4 :48
      5 :56
      6 :60
      7 :70
      8 :80
      9 :90
      10 : 109

上述代码numbers是数组变量。

2.7.3 跳转语句

□ break语句

□ 返回语句return

1.break语句

break语句可用于switch引导的分支结构及以上三种循环结构,它的作用是强行退出循环结构,不执行循环结构中剩余的语句。break语句格式如下:

      break

使用break语句示例:

      local numbers ={106, 22, 30, 48, 56, 60, 70, 80, 90, 109}
      for i, v in ipairs(numbers) do
        if i == 3 then
          break
        end
        print(i ..":"..v)
      end

在上例中,当条件i==3的时候执行break语句,程序运行结果是:

      1 :106
      2 :22

2.返回语句return

return语句可以当前函数中退出,返回到调用该函数的语句处。返回语句有两种格式:

      return expression
      return