Lua学习笔记--基本语法规则&控制流语句

学会了Lua的环境配置之后,并且成功的打印了一个hello world,下面可以真正踏入lua的大门啦!

下面的例子都是用上次编译好的LuaTest.exe来运行的,记录的一般是与C/C++语法不同的地方。


一.基本语法规则

1.全局变量:

--全局变量
a = 10;
print(a)
--将nil赋值给一个全局变量,这个变量就被删除了
a = nil
print(a)
结果:

10
nil
请按任意键继续. . .

Lua中直接使用一个变量的话,这个变量就是全局变量。如果不使用一个变量了,就将它赋值为nil即可。


2.基本的数据类型

基本数据类型,和C/C++差不多,不过,Lua牛的地方是,函数也算是一种基本数据类型,可以像使用其他基本数据类型那样使用和管理函数。
print(type(nil))
print(type(1))
print(type("hello world"))
print(type(print))
结果:
nil
number
string
function
请按任意键继续. . .
type()关键字可以返回一个变量的类型。返回的是一个字符串,我们可以将其打印出来。

关于基本数据类型有几个注意的地方:
1.boolean变量:lua中,只有nil和false为假,其他(包括空字符串和0)都视为真
2.table数据类型:lua中唯一的数据结构,不过足够强大
3.function被视为一种基本数据类型

3.一些逻辑操作符

不等于在lua中使用~=表示,这一点是与其他的语言不一样的一点。
and操作符:如果第一个操作数为假,会返回第一个操作数,否则返回第二个操作数
or操作符:如果第一个操作数为真,会返回第一个操作数,否则返回第二个操作数
not操作符:相当于C/C++中的!操作符
print(1 and 2) --第一个为真,返回2
print(nil and 2)--第一个为nil,假,返回nil
print(false and 2)--第一个为false,假,返回false

print(1 or 2)	--第一个为真,返回1
print(nil or 2) --第一个为假,返回2
print(false or 2) --第一个为假,返回2

print(not nil)
print(not false)
print(not 1)
结果:
2
nil
false
1
2
2
true
true
false
请按任意键继续. . .

4.赋值

感觉lua有好多新颖的设定,赋值就是其中之一。Lua支持多重赋值,简单看一个例子:
--容易出错的地方,这样赋值的话,只有第一个变量赋值成功,第二个会为nil
a,b = 0
print(a, b)
--lua支持多重赋值
a,b = 1,2
print(a, b)
--多重赋值会先计算右边元素,所以可以利用这个特性来交换两个变量
a,b = b,a
print(a, b)
--右边有多余的话,会被忽略、
a,b = 1,2,3
print(a, b)
--左边有多余的话,会置为nil
a,b,c = 1,2
print(a, b, c)
结果:
0       nil
1       2
2       1
1       2
1       2       nil
请按任意键继续. . .

5.局部变量与块

局部变量的作用域仅限于声明他们的那个程序块,可以使控制结构的执行体,函数作用域,或者是一个程序块(chunk)。从C语言编程到现在,我们也应该清楚,尽可能使用局部变量是一种良好的变成习惯,局部变量可以避免将一些无用的名称引入全局作用域,局部变量比全局变量访问更快,并且,在使用结束后,出了局部变量的作用域,局部变量会被垃圾回收器回收。

--全局的变量a, b
a, b = 1, 10

if a < b then
	print(a)
	--局部变量a会屏蔽全局变量
	local a = 2
	print(a)
end

print(a, b)
结果:
1
2
1       10
请按任意键继续. . .

还有一种比较常用的写法,使用全局变量初始化局部变量:
--全局的变量a, b
a, b = 1, 10

if a < b then
	print(a)
	--使用全局变量初始化局部变量
	local a = a
	print(a)
end

print(a, b)
结果:
1
1
1       10
请按任意键继续. . .


二.控制流语句

1.if else ... then...

哪个语言都得有的东东,Lua当然也少不了,不过换了点格式:
--从输入读取一行数据
line = io.read()
--将字符串转化为数字,如果转化成功变成数字,否则返回nil
n = tonumber(line)
--条件判断
if n == nil then
	print("input is not valid number")
elseif n < 5 then
	print("num < 5")
elseif n == 5 then
	print("num = 5")
else
	print("num > 5")
end
结果:
5
num = 5
请按任意键继续. . .

lua条件判断的话,需要注意条件完事之后有个then,并且在整个的条件语句块结束之后有个end。
lua不支持swith case,所以就需要用一大串elseif来实现相同的功能了。


2.while

a = 1
while a < 10 do
	print(a)
	a = a + 1--lua木有++操作,所以得写原始写法
end 
结果:
1
2
3
4
5
6
7
8
9
请按任意键继续. . .

这个过程与其他语言一样,先判断while条件是否为真,为真执行循环体,否则不执行。


3.repeat...until

相当于c的do while语句,测试在循环之后,所以循环至少执行一次。
--打印输入第一行不为空的内容
repeat
	line = io.read()
until line ~= ""
print(line)
结果:
直接拍回车的话不会打印,一直repeat,而只要输入内容了就会打印并结束。


4.for语句

for语句和C/C++的差别还是有点大的。
for有三个控制变量,第一个为起始,第二个为终点,第三个为步长(可以不写),如果不写步长,那么会默认为1。
比如我们想按10->1来进行循环,就要酱紫写:
--for语句有三个控制变量,最后一个为步长
for i = 10, 1, -1 do
	print("hehe")
end
结果:
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
hehe
请按任意键继续. . .

for语句还有一种类似C++迭代器的那种用法,不过那个等到学习table的时候再系统学习啦。

5.break和return

break和return还是和C++差不多的,一个用于跳出循环,一个用于跳出函数。
不过return有个特殊情况:
如果在C++的话,这样一句函数,肯定是直接返回的,不会进行后面的操作:
void func()
{
<span style="white-space:pre">	</span>return;
<span style="white-space:pre">	</span>cout<<"hehe"<<endl;
}
但是,在lua中,由于return只能放在语句块的最后一句话,换句话说就是end,until,else前的一句。而在其他位置就属于语法错误,不会按照我们想象中的返回。
一个例子:
function func()
	--我们想让函数直接返回,但是做不到啊...
	return
	print("hehe")
end

func()
结果:
hehe
请按任意键继续. . .

解决方法也是有的,我们自己构造一个语句块:
function func()
	--自己构造一个语句块
	do
		return
	end
	--这下下面的就执行不了了
	print("hehe")
end

func()
结果:
请按任意键继续. . .





.

















你可能感兴趣的:(学习,lua,语法,脚本语言,控制流)