快速掌握Lua 5.3 —— 各种运算符以及各种声明
2016-01-13 13:34
471 查看
Q:Lua中有哪些运算符?
A:1、算数运算符:加
+,减
-,乘
*,除
/,负
-,乘方
^。
2、关系运算符:小于
<、大于
>、小于等于
<=、大于等于
>=、等于
==、不等于
~=。
3、逻辑运算符:并且
and,或
or,非
not。
4、字符串连接符
..。
Q:Lua中的逻辑运算符与C语言中的有何不同?
A:C语言中的&&和
||中所有表达式都可以作为判断条件,并且最终返回的值一定是
true或者
false。而Lua中
and和
or只将第一个表达式作为判断条件,并且最终返回的是其中一个条件的值。
遵循如下规则:
and的第一个条件如果为假,则返回第一个条件的值;否则返回第二个条件的值。
or的第一个条件如果为真,则返回第一个条件的值;否则返回第二个条件的值。
[code]print(4 and 5) --> 5 print(nil and 13) --> nil print(false and 13) --> false print(4 or 5) --> 4 print(false or 5) --> 5
Q:Lua中运算符的优先级以及二元运算符的结合性?
A:优先级从高到低:^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
^和
..这两个二元操作符是右结合,其他的二元操作符都是左结合。
对优先级以及结合性混乱的话,还是最好是用
()吧。
Q:Lua中一个表达式给多个变量赋值?
A:[code]a, b = 10, 2*x -- 相当于"a = 10; b = 2*x;"
Lua在同时对多个变量赋值时,首先计算值,然后再赋给变量。可以利用这一特性实现两个变量值的交换:
[code]x, y = y, x -- swap 'x' for 'y' a[i], a[j] = a[j], a[i] -- swap 'a[i]' for 'a[j]'
在同时对多个变量赋值时,Lua可自动调整每个变量所获得的值。当给出的值少于给出的变量时,额外的变量会被赋值为
nil;而当给出的值多于给出的变量时,额外的值会被忽略:
[code]a, b, c = 0, 1 print(a,b,c) --> 0 1 nil a, b = a+1, b+1, b+2 -- value of b+2 is ignored print(a,b) --> 1 2 a, b, c = 0 print(a,b,c) --> 0 nil nil
Q:Lua中使用的变量默认都是全局变量,如何声明一个局部变量并使用?
A:使用local关键字。
[code]--[[ 此例在Lua的“stand-alone interpreter”模式中测试会不正常, 因为第二行本身是一个"chunk",接下来第三行会被认定为一个新的"chunk",那时"i"已经不存在了。]] -- 如果想在Lua的“stand-alone interpreter”模式中测试此例,请将代码写在"do-end"中。 -- do x = 10 local i = 1 -- local to the chunk while i<=x do local x = i*2 -- local to the while body print(x) --> 2, 4, 6, 8, ... i = i + 1 end if i > 20 then local x -- local to the "then" body x = 20 print(x + 2) else print(x) --> 10 (the global one) end print(x) --> 10 (the global one) -- end
Q:Lua中几种控制结构的语法?
A:[code]-- if if cond then dosomething end if cond then dosomething else dosomething end if cond then dosomething elseif cond then dosomething ... -- elseif else dosomething end -- while while cond do dosomething end –- repeat repeat dosomething untile cond -- do do dosomething end -- Numeric for for var = beginval, endval, valstep do -- valstep如果不写,默认是1。 dosomething end -- Generic for for var1, var2, ... in exp do dosomething end -- break,可以写在任何循环中。 break -- return,可以写在任何函数中。 return ret1, ret2, ..., or nothing
附加:
1、lua认定tables, userdata, functions是否相等,是通过他们的引用,而非他们的值。这就好像C语言中比较两个指针是否相等一样。[code]a = {}; a.x = 1; a.y = 0 b = {}; b.x = 1; b.y = 0 c = a print(a == c) --> true print(a == b) --> false
2、lua比较字符串通过从每个字符串的第一个子符开始,按顺序比较两个字符串中对应位置的子符,只要其中一个字符的ASCII值比另一个大,则整个字符串就大于另一个字符串,否则个字符串小于另一个字符串。
3、只有数字与数字之间,字符串与字符串之间可以比较大小。其他相同种类或不同种类的值之间只能比较是否相等。
4、需要注意的是,Lua中只认定
false和
nil为假,其他的值均为真。所以,
[code]print(not 0) --> false
5、两个关于
and和
or有用的使用方式,
[code]x = x or v -- x如果没有被赋值,则默认值为v。 (a and b) or c -- 当b为true时,相当于"a ? b : c"。
6、Lua中局部变量的访问速度比全局变量快,所以可以使用局部变量时请尽可能使用。
7、”Numeric for”中”beginval”, “endval”, “valstep”如果给的是表达式,只会在for开始时计算一次,在for运行过程中不会再被计算。
[code]-- f(x)只会在开始时计算一次,for中如果改变了x的值,f(x)也不会再被计算。 for i=1,f(x) do print(i) end
8、
break和
return只能写在”chunks”的结尾,如果写在中间会报错。如果你一定要写在中间,请将其用
do-end包起来。
相关文章推荐
- Lua Module
- Lua 5.1 参考手册
- lua的string库
- 快速掌握Lua 5.3 —— 让我们开始吧
- openresty lua学习笔记
- Lua 独立解释器
- Lua 全局变量
- lua_state
- Lua 命名规范
- Lua chunk(程序块)
- Lua 运行你的第一个HelloWorld
- leetcode——Evaluate Reverse Polish Notation 求算式值(AC)
- [LeetCode] Evaluate Reverse Polish Notation, Solution
- Lua脚本语言简明入门教程
- Lua & C 交互 3 c/c++调用lua
- Lua & C 交互 2 尝试操作lua栈
- Lua & C 交互 1 环境搭配
- luci 打印函数封装
- Lua 与C 交换 第一篇
- Lua中的模块与module函数详解