尽管 Lua 的关键词的设计,运行符的设计,语法的设计等方面与 C 很相似,但我们还要注意其明显不同的地方。
条件判断时的真假条件
Lua 中所有的值都可以作为条件。在控制结构的条件中除了 false 和 nil 为假,其他值都为真。所以 Lua 认为 0 和 空串 都是真。
而 C 中,认为只要是在内存中表现为 0 值的符号都为假。
字符串
Lua 中字符串的定义是 字符的序列。lua 的字符串可以包含任何数值字符,包括嵌入的 0。这意味着你可以存储任意的二进制数据在一个字符串里。Lua 本身有相应的函数来处理这样的字符串。
而 C 语言中,虽然也可以在一个字符串中存放 0,但其字符串处理函数不能正确处理放在中间的零值,因为 C 中的算法不是用长度来做判断,而是以遇到第一个零值来判断的。
转义字符:
/a bell /b back space -- 后退
/f form feed -- 换页 /n newline -- 换行
/r carriage return -- 回车 /t horizontal tab -- 制表
/v vertical tab // backslash -- "/"
/" double quote -- 双引号 /' single quote -- 单引号
/[ left square bracket -- 左中括号 /] right square bracket -- 右中括号
还可以用[[…]]表示字符串,这种形式的字符串可以包含多行可以嵌套且不会解释转义序列。
运行时,Lua会自动在string和number之间自动进行类型转换。
关系运算符
Lua 中的不等号是 ~=,
而 C 中的不等号是 !=。
逻辑运算符
Lua 中的逻辑运算符是 and, or, not,而 C 中的逻辑运算符是 &&, ||, !。而且它们的用法很大的不一样,Lua 的逻辑运算符的用法显得有点“小技巧”。
Lua 逻辑运算符认为 false 和 nil 是假(false),其他为真,0也是true。
and 和 or 的运算结果不是 true 和 false,而是和它的两个操作数相关。
not 的结果一直返回 false 或者 true。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
C语言中的三元运算符
a ? b : c
在Lua中可以这样实现:
(a and b) or c
连接运算符
.. --两个点
字符串连接,如果操作数为数字,Lua将数字转成字符串
优先级
从高到低的顺序:
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
除了^和..外所有的二元运算符都是左连接的。
多变量赋值
Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。遇到赋值语句 Lua 会先计算右边所有的值然后再执行赋值操作。当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略
a. 变量个数>值的个数 按变量个数补足nil
b. 变量个数<值的个数 多余的值会被忽略
C 中,只有单变量赋值的概念。
表的构造
构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组(第一个元素索引为1)
不管用何种方式创建table,我们都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。