- 0X28 循环语句
-
对于while,如果循环条件永远为真(例如在循环条件表达式位置写了一个true或者恒真表达式),则称这种循环为"死循环".因为它的执行永远不可能停止.
-
repeat也可以是死循环,只要它的循环终止条件恒假.
-
死循环在很多情况下都被视为编程错误.但是有的情形下,我们会希望一个循环是死循环.比如我们编写一个计算器程序,我们当然不希望计算一次后程序就退出然后我们重启程序.如果把主体程序放在一个死循环内,一次计算执行结束后,就会开始新一轮的等待输入和计算.
-
为了让死循环可控,我们需要引入break语句.
-
break语句是一种仅仅用在循环体内的语句.如果在循环体内执行到它.则不论循环体内它后边还有多少代码,也不论循环条件是否成立.这个循环都会立刻终止.一般来说它都会配合if语句使用,例如
while (i<10) do prrint(i) i=i+1 if i==5 then break end end
这个循环的循环体本来应该执行10次,但第5次,由于"i==5"成立,执行了break语句.循环立刻终止.
-
多层循环嵌套,break语句只影响一层.break语句只会打断直接包含它的最里层的那个循环语句.
-
死循环也可以被break打断.所以我们在死循环内设置一个带条件判断的break,就能在适当的情况下打断死循环.
-
break除了控制死循环还有另一个作用.终止不需要的后续循环,节省时间.比如我们编写一个程序,通过循环来寻找大于10000的一个素数.我们设置循环次数为1000000次.但是实际上用不到那么多次循环我们就能找到一个素数.找到一个素数之后的循环对于我们的问题来说都是没有意义的.用break打断它,就可以省下很多时间.
-
如果学过C等语言,可能会知道除了break,一般语言还会支持一个continue语句.它不打断整个循环,只是会停止本次循环体的执行,直接进入到下次的条件判断.但是Lua不支持这个关键字.如果需要类似的功能,可以通过循环语句和if语句复合使用.
-
在函数定义中return语句也有流程控制作用.不管函数体内后边还有多少代码,也不管有多少循环和选择的嵌套,也不管循环条件和死循环,一旦执行到return语句,立刻返回返回值.然后整个函数终止执行.
-
循环结构用来处理需要反复实施的动作.需要注意的是,一般的编程教材喜欢强调循环结构能代替重复的代码调用.却没有强调另一个问题.
- 循环可以替代重复地编写形式相同的代码.例如循环100次可以替代把循环的代码(循环体)复制粘贴100次然后执行.
- 反之重复书写(或者复制粘贴)相同形式的代码不能取代循环结构.因为循环结构的循环次数可以通过变量来确定.但是对于静态编译的语言,复制粘贴了多少次,就会执行多少次.不可能在程序运行过程中更改. (但是对于动态语言,可以通过动态生成代码完成选择,循环等结构控制.但是这样做的效率非常低下)
- 0X2B 循环for