1.if then else end
if 语句先测试其条件,并根据条件是否满足执行条件相应的then部分或else部分。else部分是可选的。
if a < 0 then a = 0 end
if a < b then return a else return b end
if a < b then rerurn a elsif a == b then return 0 else return b end
如果要编写嵌套的if语句可以使用else-if,可以避免重复使用end lua语言不支持switch语句,所以这种一连串的else-if语句比较常见
2.while
当条件为真时while循环会重复执行其循环体。lua语言先测试while语句的条件,条件为假时则循环结束。否作,lua会执行循环体并不断重复这个过程。
local i = 1
while a[i] > 0 do
print(a[i])
i = i +1;
end
3.repeat-until repeat-until
语句会重复执行其循环体直到条件真时结束。由于条件测试在循环体之后执行,所以循环体至少会执行一次。
--输出第一个非空的行
local line
repeat
line = io.read()
until line ~=“”
print(line)
和其他大多数其他编程语言不同,在lua语言中,循环体内声明的局部变量的作用域包括测试条件
#include <stdio.h>
int main(void)
{
int count = 0; //在外部块中声明
do
{
int count = 0;
++count;
printf(“count = %d\n”,count);
}while(++count <= 5);
printf(“count = %d\n”, count)
system(“pause”)
return 0;
}
输出内容为:
count = 1
count = 1
count = 1
count = 1
count = 1
count = 1
count = 6
循环测试条件中使用的count是外部块中声明的,如果使用lua则使用循环体内声明的count
4.数值型for
for语句有两种形式:数值型for和泛型for
数值型for: for var = exp1, exp2, exp3 do something end
在这种循环中, var 值从 exp1变化到 exp2 前的每次循环会执行 something ,并在每次循环结束后将步长 exp3 加到 var上,第三个表达式 exp3 是可选的,若不存在,lua 语言会默认步长值为1,如果不想给循环设置上限,可以使用常 math.huge: 按顺序遍历。
pairs和ipairs的区别:
- pairs迭代器遍历表中的键值对,顺序随机且每次运行时产生不同的顺序。遍历过程中每个元素只会出现一次。
- ipairs迭代器遍历列表,按顺序遍历,每个元素也只会出现一次
键值对:table1 = {[“name”] = “tom”, [“age”] = 18, [“sex”] = “female”}
列表:table2 = {1, 2, 3};
5.break、return和goto
break和return语句用于从当前的循环结构中跳出,goto语句则允许跳转到函数中的几乎任何地方。
break
我们可以使用break语句结束循环,该语句会中断包含它的内层循环(例如for、repeat或者while);该语句不能在循环外使用。break中断后,程序会紧接着被中断的循环继续执行。
return
return语句用于返回函数的执行结果或简单地结束函数的运行。所有函数的最后都有一个隐含的return,因此我们不需要在每一个没有返回值的函数最后书写return语句。
local i = 1;
while a[i] do
if a[i] == v then return i end
i = i +1
end
print(i)
思考:a={1,2,3},v=1,那么i打印出来是什么?v=4呢?
答案:当v=1时,无法打印出i;当v=4时,打印出的i为4。
goto
goto语句用于当前程序跳转到相应的标签处继续执行。goto的语法非常传统,即保留字goto后面紧跟着标签名。 标签名语法:标签名称前后各紧跟两个冒号,形如::name::。这个复杂的语法是有意而为的,目的是为了在程序中形目地突出这些标签。
在使用goto语句时,lua语言设置了一些限制条件:
- 首先,标签遵循常见的可见性规则。思考:可以直接跳转到一个代码块中的标签吗或者goto可以跳转到函数内吗?为什么(不可以,因为代码块中的标签对外不可见。)
- 其次,goto不能跳转到函数外。
- 最后,goto不能跳转到局部变量的作用域。
lua语言规范中一个很有用的细节是,局部变量的作用域终止于声明变量的代码块中的最后一个有效语句处,标签被认为是无效语句。
while some_condition do
if some_other_conditon then goto continue end
local var = something
some code
::continue::
end
思考:这个goto语句跳转到了变量var的作用域内吗?
答案:没有,因为这个continue标签出现在该代码块的最后一个有效语句后,因此goto并未跳转进入变量var的作用域内。