关于lua数字for循环易错点

本文探讨Lua语言中循环控制变量的特殊处理方式。通过一个示例代码解释了内部索引(internalindex)与外部索引(externalindex)的区别,并讨论了在循环体内修改控制变量可能带来的影响。

看以下代码:

[plain]  view plain copy
  1. for i=1,2 do  
  2.   print(i)  
  3.   i=3  
  4. end  

输出是什么?如果习惯了C/C++语言,会觉得因为改变了控制变量i为3,所以在执行第二次循环体之前判断不通过,所以输出是1。

但结果输出是1和2,即虽然改变了i,但循环还是执行了2次。这是为什么呢?

看了lua的源代码,发现在语法分析阶段,表达式中的i(也叫控制变量)和循环体中的i并不是一个值,其实表达式中的i叫internal index,循环体中的i叫external index。

所以在循环体中并没有改变表达式中的i的值。

至于为什么lua要这样做,估计是为了安全吧,怕在循环体中不经意地改变了表达式的i,从而产生bug。

另外,在Progammming in Lua一书中也提到不要在循环体内修改控制变量(实际修改的是external index)的值,否则会有不可预知的结果。

### Lua 中 `for` 循环的使用方法 在 Lua 编程语言中,`for` 循环是一种重要的控制结构,用于重复执行一段代码。Lua 的 `for` 循环分为两种主要形式:数值型 `for` 循环和泛型 `for` 循环(即 `for...in` 循环)。这两种循环各有其特和适用场景。 #### 数值型 `for` 循环 数值型 `for` 循环适用于需要基于计数器变量来迭代的情况。它的基本语法如下: ```lua for 变量名 = 初值, 终值, 步长 do -- 要执行的代码块 end ``` 其中: - **初值** 是循环开始时变量的初始值。 - **终值** 是循环结束时变量的目标值。 - **步长** 是每次迭代后变量增加的值,默认为 1。 如果省略步长,则默认步长为 1。当步长大于零时,循环会在变量小于等于终值时继续;当步长小于零时,循环会在变量大于等于终值时继续[^3]。 ##### 示例代码 以下是一个简单的数值型 `for` 循环示例,打印从 1 到 5 的整数: ```lua for i = 1, 5 do print(i) end ``` 输出结果将是: ``` 1 2 3 4 5 ``` 如果希望以更大的步长进行迭代,可以设置第三个参数作为步长。例如,以下代码将以步长为 2 进行迭代: ```lua for i = 1, 10, 2 do print(i) end ``` 输出结果将是: ``` 1 3 5 7 9 ``` --- #### 泛型 `for` 循环 (`for...in`) 泛型 `for` 循环通常与迭代器一起使用,适合遍历表或其他可迭代对象。其基本语法如下: ```lua for 键, 值 in 迭代器表达式 do -- 要执行的代码块 end ``` 在这种情况下,`键` 和 `值` 是由迭代器返回的一对数据项。最常用的迭代器是 `pairs()` 和 `ipairs()` 函数。`pairs()` 遍历整个表,而 `ipairs()` 仅按顺序遍历数组部分。 ##### 示例代码 下面的例子展示了如何使用泛型 `for` 循环遍历一个表并打印键值对: ```lua local myTable = {name = "Alice", age = 25, city = "New York"} for key, value in pairs(myTable) do print(key .. ": " .. tostring(value)) end ``` 可能的输出结果为(注意表的无序性): ``` city: New York age: 25 name: Alice ``` 另一个例子是使用 `ipairs()` 来遍历数组类型的表: ```lua local numbers = {10, 20, 30, 40} for index, value in ipairs(numbers) do print(index .. ": " .. value) end ``` 输出结果将是: ``` 1: 10 2: 20 3: 30 4: 40 ``` --- ### 总结 通过上述介绍可以看出,Lua 的 `for` 循环非常灵活且功能强大。无论是基于固定范围的数值型循环还是动态遍历的泛型循环,都可以满足不同场景下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值