<返回目录     Powered by claud/xia兄

第4课: 流程控制

流程控制概述

流程控制语句决定了程序的执行顺序。Lua提供了完整的流程控制结构,包括条件判断、循环和跳转语句。理解这些结构的内部实现和最佳实践对于编写高效、可维护的代码至关重要。

Lua流程控制的设计哲学:

if条件语句

if语句用于根据条件执行不同的代码块。Lua的if语句支持多种形式,从简单的单条件到复杂的多分支判断。

基本if语句

= 18 then
    print("成年人")
end

-- if-else语句
local score = 85
if score >= 60 then
    print("及格")
else
    print("不及格")
end

-- if-elseif-else语句
local grade = 75
if grade >= 90 then
    print("优秀")
elseif grade >= 80 then
    print("良好")
elseif grade >= 60 then
    print("及格")
else
    print("不及格")
end

条件判断的深入理解

条件判断的真值规则:

在Lua中,只有nil和false被视为假值,其他所有值都是真值:

if语句的性能考虑

条件判断的优化策略:
= 18
end

-- 缓存复杂表达式
local function checkPermission(user, action)
    local isAdmin = user.role == "admin"
    local hasPermission = user.permissions[action]
    return isAdmin or hasPermission
end

-- 使用表查找代替if-elseif
local gradeToText = {
    [90] = "优秀",
    [80] = "良好",
    [60] = "及格"
}

local function getGradeText(grade)
    for threshold, text in pairs(gradeToText) do
        if grade >= threshold then
            return text
        end
    end
    return "不及格"
end

while循环

while循环在条件为真时重复执行代码块。适用于不确定循环次数的场景。

基本while循环

 10 then
        break
    end
    print(count)
end

while循环的深入理解

while循环的执行流程:
  1. 检查条件表达式
  2. 如果条件为真,执行循环体
  3. 返回步骤1
  4. 如果条件为假,退出循环

while循环可能一次都不执行(初始条件为假时)。

repeat-until循环

repeat-until循环至少执行一次,直到条件为真时退出。这与while循环的行为相反。

基本repeat-until循环

 5

-- 猜数字游戏示例
local secret = 42
local guess
repeat
    print("请输入一个数字:")
    guess = tonumber(io.read())
    if guess < secret then
        print("太小了")
    elseif guess > secret then
        print("太大了")
    end
until guess == secret
print("恭喜你猜对了!")

repeat-until的深入理解

repeat-until与while的区别:
 0
    return num
end

local count = readPositiveNumber("请输入数量: ")
print("数量: " .. count)

for循环 - 数值型

数值型for循环用于按指定步长遍历数值范围。这是Lua中最常用的循环结构之一。

基本for循环

数值型for循环的深入理解

for循环的内部机制:

数值型for循环的执行流程:

  1. 计算初始值、终值和步长(只计算一次)
  2. 检查循环变量是否超出终值范围
  3. 如果未超出,执行循环体
  4. 循环变量增加步长
  5. 返回步骤2

循环变量是局部变量,循环结束后不可访问。

for循环的高级应用

for循环 - 泛型

泛型for循环用于遍历迭代器函数返回的值。Lua提供了内置的迭代器,也可以自定义迭代器。

ipairs迭代器

ipairs用于遍历数组(从索引1开始的连续整数索引)。

pairs迭代器

pairs用于遍历表的所有键值对,包括数组部分和字典部分。

自定义迭代器

迭代器的实现原理:

泛型for循环的语法:

for var_1, ..., var_n in explist do block end

等价于:

do
  local _f, _s, _var = explist
  while true do
    local var_1, ..., var_n = _f(_s, _var)
    _var = var_1
    if _var == nil then break end
    block
  end
end
= 1 then
            return i, t[i]
        end
    end, t, #t + 1
end

local arr = {10, 20, 30, 40, 50}
for i, v in ripairs(arr) do
    print(i, v)
end
-- 输出:
-- 5  50
-- 4  40
-- 3  30
-- 2  20
-- 1  10

-- 自定义迭代器:步长迭代
local function stepIterator(start, stop, step)
    return function(state, current)
        local nextValue = current + step
        if (step > 0 and nextValue <= stop) or 
           (step < 0 and nextValue >= stop) then
            return nextValue
        end
        return nil
    end, nil, start - step
end

for i in stepIterator(0, 10, 2) do
    print(i)
end
-- 输出: 0 2 4 6 8 10

break和goto语句

break用于跳出当前循环,goto用于跳转到指定的标签。

break语句

goto语句(Lua 5.2+)

goto的最佳实践

goto的使用建议:

嵌套循环

嵌套循环是指一个循环包含在另一个循环内部。理解嵌套循环的执行流程和优化策略很重要。

 maxVal then
                maxVal = matrix[i][j]
            end
        end
    end
    return maxVal
end

print(findMax(matrix))  -- 9

嵌套循环的性能优化

嵌套循环优化策略:

综合示例

= 90 then
        return "优秀"
    elseif average >= 80 then
        return "良好"
    elseif average >= 60 then
        return "及格"
    else
        return "不及格"
    end
end

-- 打印成绩单
print("=== 学生成绩单 ===")
for i, student in ipairs(students) do
    local average = calculateAverage(student.scores)
    local grade = getGrade(average)
    
    print("\n" .. student.name)
    print("成绩: ", table.concat(student.scores, ", "))
    print(string.format("平均分: %.2f", average))
    print("等级: " .. grade)
end

-- 查找最高分学生
local function findTopStudent(students)
    local topStudent = nil
    local topAverage = 0
    
    for i, student in ipairs(students) do
        local average = calculateAverage(student.scores)
        if average > topAverage then
            topAverage = average
            topStudent = student
        end
    end
    
    return topStudent, topAverage
end

local topStudent, topAverage = findTopStudent(students)
print("\n最高分学生: " .. topStudent.name)
print(string.format("平均分: %.2f", topAverage))
重要提示:
练习题:
  1. 编写程序判断一个数是奇数还是偶数(使用if语句)
  2. 使用while循环计算1到50的偶数和
  3. 使用for循环打印99乘法表
  4. 编写程序找出1到100之间的所有质数
  5. 实现一个简单的计算器,支持加减乘除运算
  6. 编写程序实现冒泡排序算法
  7. 使用repeat-until实现一个猜数字游戏
  8. 自定义一个迭代器,遍历斐波那契数列
  9. 编写程序实现二维矩阵的转置
  10. 使用嵌套循环打印杨辉三角