《Lua程序设计(第4版)》:第1章练习答案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/belous_zxy/article/details/86537541

放假前忙于期末考试,电力系统、电机什么的太难受啦~~  之前学的Lua都忘得差不多了。

目录

总结

练习

练习1.1

练习1.2

练习1.3

练习1.4

练习1.5

练习1.6

练习1.7

练习1.8


回顾下前几章的内容。

总结

程序段:一组命令或表达式组成的序列,可以是一个文件或者解释器交互模式下的一个程序段。Lua解释器可以支持非常大的程序段。

交互式模式:不带有任何参数时运行Lua解释器,当输入的命令首字符是EOF控制字符时退出交互式模式。(WIN环境下使用Ctrl+Z;POSIX环境下使用Ctrl+D)

os.exit()函数也可用于退出交互式模式。

交互式模式下输入表达式会直接输出表达式的值,赋值语句不会立即返回结果,须要再调用变量名。(老版本中表达式想要输出表达式的值,需要在最前面加‘ = ’号。

分隔符:当一行有多条语句时,可以用‘ ; ’将各语句分开。然而Lua中分隔符并不是必须的,回车和空格都可以分隔开两条语句,只是可读性不佳罢了。

需要注意的是——在交互式模式下语句后加分号,还有个作用是不立即显示表达式的值

标识符:由任意字母、数字、下划线组成且不得以数字开头的字符串。下划线+大写字母通常被Lua语言用于特殊用途,尽量避免使用该组合;Lua语言保留字也不能用作标识符。(--标识符大小写敏感)

保留字:and break do else elseif end false goto for function if in local nil not or repeat return then true until while

保留字总共只有22个,可以看出Lua的保留字非常少,语法特性并不复杂。保留字大多是控制流、逻辑运算、变量类型的。

注释:Lua语言中的注释有两种。单行注释,使用连续的两个连字符开始(--);多行注释,使用连续的两个连字符和连续的左方括号开始,连续的两个右方括号结束,方括号之间的内容都是注释。

需要特别说明的是,Lua语言中的长字符串(多行字符串)是连续两个左方括号开始,连续两个右方括号结束。如果同时使用多行注释和多行字符串会很容易产生混乱。Lua语言给出的对策是连续两个方括号中加入N个等于号,N可以是任意自然数,只有加入相同数量的等于号的左、右方括号才能相互匹配!这种机制非常有用!

1.在一段程序中存在长注释时,在外面再次注释掉这段程序只需调整等号数量和内层注释等号数量不等就可以了。解决了C类语言中/*   */嵌套时需要来回删除末尾*/的繁琐问题。

2.长注释和多行字符串共存时不同的等号可以区分两者的结束位置。

3.多行字符串中难免会出现诸如 ]] 的字符串,加入若干等号以保证多行字符串可以在正确的位置结束。

注:常用的长注释写法,--[[

                                       ……   

                                       --]] ,在注释开头只需多加一个连字符即可关闭注释。

dofile函数:将指定文件内容作为Lua程序块执行,默认参数为stdin;执行后返回程序快返回的所有值。(文件名需要加拓展名)

                    注意,如果调用的文件没有返回值,dofile函数返回值为 nil ;

                               文件名不区分大小写!!!

全局变量:Lua语言中所有不声明直接使用的都是全局变量!调用未曾使用的全局变量也不会出错,它们的值是 nil 。

当把 nil 赋值给全局变量时,Lua会回收该全局变量(占用的内存)。

基本类型:Lua语言中共有 8 种基本类型,分别是 nil 、boolean 、number、string、userdata、function、thread、table 。

使用系统的type函数可以获取每个值对应的类型名称(一个string值)。

1.nil类型的值只有 nil ,表示无效值.

2.boolean类型的值有两个,分别是关键字 true\false ;需要注意的是在Lua中条件判断表示错误的只有false和nil,其他一切变量都是正确。

3.number类型是数值类型,数值类型又有两种分别是整型integer(64位/32位)、浮点类型float(双精度/单精度)。

4.string类型是字符串类型,Lua标准函数库提供了很多处理字符串的函数。

5.userdata类型是用户数据类型,它用来表示由应用或C语言编写的库所创建的类型。如标准I/O库采用C语言标准输入输出,io.stdin就是一个C语言标准库创建的FILE指针类型。

6.function类型是函数类型,函数在Lua中是一个基本类型,函数可以像一个其他类型值一样在变量之间传递。

7.thread类型是线程类型,为Lua的并行运算提供有力支持。

8.table类型是表类型,个人感觉表是Lua中的核心类型,表可以轻松完成大多存储任务,Lua标准库也提供了许多处理表类型的函数。

逻辑运算符:Lua语言中支持三种常见的逻辑运算符,and、or、not 。这三种逻辑运算的条件判断都以false和nil为错误;其他都为正确。

not运算符——判断 not 后跟随的表达式的值正确与否,返回一个取反后的 boolean 类型值。

and运算符——A and B ,先计算表达式A的值,如果A的判断为true,计算表达式B的值并返回;如果A的判断为false,立即返回表达式A的值,并不再计算表达式B的值!

or运算符——A or B,先计算表达式A的值,如果A的判断为true,立即返回表达式A的值;如果A的判断为false,计算表达式B的值并返回。

注意:Lua语言中的 and 和 or 运算符的返回值并不一定是boolean类型,与其他C类语言的逻辑运算并不一样,Lua的 and 和 or 可以完成许多有趣又给力的操作~

          例如,表达式 A and B or C 在表达式B的值不为false时等价于C语言的 ?: 运算符。and运算比or运算的优先级要高,因此先判断A,如果A的值为false,继续计算 false or C,也就是表达式最终会返回表达式C的值;如果A的值是true,计算表达式B的值后,如果B的值为true则返回表达式B的值。

作为独立语言Lua的解释器:Lua是嵌入式语言,常作为拓展嵌入在C/C++等程序中,Lua当然也是一个独立的语言。在Lua官网下载源码后编译lua.c文件可生成可执行文件lua,这就是作为独立语言时Lua的解释器(或者通过MAKEFILE生成)。独立Lua解释器包括所有标准库,包括调试库。

独立解释器的参数有

1. -e 可以直接在命令行输入代码;

2.  -l 加载库,效果与dofile函数类同。如需加载的库文件为MyLua.lua ,参数里写 -lMyLua 或者 -l MyLua都是没问题的。

     库文件运行的返回值存储在全局变量 [库文件名] 中,如MyLua中,当库文件没有返回值时,变量赋值为true(并不是nil)。

     和dofile相同,库文件名也是不区分大小写的!

3.  -i 运行脚本后进入交互模式,此功能方便与调试。

4.  -v 打印版本信息。

5.  -E 忽略环境变量 LUA_INIT_5_3 / LUA_INIT 和 LUA_PATH和LUA_CPATH的值。

      如不忽略则解释器会运行LUA_INIT_5_3 中的Lua代码,变量不存在则查找 LUA_INIT ,都不存在则运行文件名参数。环境变量以@开头则认为环境变量中的是一个文件地址。

arg变量:向解释器传入的参数都会存在arg变量中,这个预设的全局变量的类型是表。arg[0] 存储的是执行的文件地址或 -e参数对应的指令。arg[-1]、arg[-2]等存储之前的调用内容,如 lua -e 之类的。arg[1]、arg[2] 存储的是除 -e、-e对应的语句、文件名以外的变量,按传入顺序存储。

特别的,也可以用可变长参数(…)来得到arg[1]、arg[2]……等传入参数。

练习

练习1.1

输入负数时,会产生无限递归,引发堆栈溢出。只需加个负数判断即可,输入为负数时返回 -1 。

function fact(n)
  if n<0 then
    return -1
  elseif n==0 then
    return 1
  else
    return n*fact(n-1)
  end
end
print("Enter a number")
a=io.read("*n")
print(fact(a))

练习1.2

个人更喜欢 dofile 函数的方式,因为这种方式更加的灵活。但固定须要的函数库用 -l 更方便一些。

例:将twice函数写在 mlualib.lua 文件下

lua -lmlualib " "  或  dofile("mlualib.lua")

print(twice(2))

--mlualib.lua文件
function twice(x)
    return 2.0*x
end

练习1.3

SQL类语言大多有 -- 作为单行注释。

练习1.4

___   _end   End   NULL  

练习1.5

false,因为 type 函数的返回值类型是string。

练习1.6

检查变量 x 的值是否为 boolean 类型,只需检查是否为 true 和 false 即可。

ans = (x == true or x == false)

print(ans)

练习1.7

不是必须的;加上括号会让程序可读性提高。

练习1.8

解释器执行的脚本文件名存储在 arg[0] 中,文件名可能是一个绝对地址的形式,因此需要用string.find函数进行简单的模式匹配。

fis=string.find(arg[0],"[^\\/]-$")
pmname=string.sub(arg[0],fis)
print(pmname)

END

猜你喜欢

转载自blog.csdn.net/belous_zxy/article/details/86537541
今日推荐