算式操作符 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
^ | 指数 |
% | 取模 |
print(1 + 1) -->output 2 print(5 / 10) -->output 0.5。 这是Lua不同于c语言的 print(5.0 / 10) -->output 0.5。 浮点数相除的结果是浮点数 -- print(10 / 0) -->注意除数不能为0,计算的结果会出错 print(2 ^ 10) -->output 1024。 求2的10次方 local num = 1357 print(num % 2) -->output 1 print((num % 2) == 1) -->output true。 判断num是否为奇数 print((num % 5) == 0) -->output false。判断num是否能被5整数
关系操作符 | 说明 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
= |
大于等于 |
== | 等于 |
~= | 不等于 |
所有的这些操作符的运算结果都是true或
false
2.2:== 和 ~=
==用于相等性测试,操作符~=用于不等性测试。
这2个操作符可以用于任意2个值。
如果2个比较的值是不用的类型,lua就认为他们是不相等的。
print("a" == 3) --> output false
如果2个比较的值是同一种类型的,则根据类的大小规则的比较。
print(1 == 2) --> output false
print("a" == "a") --> output true
注意nil只与其之身相等
print(nil == nil) --> output true
print(nil == "false") --> output false
2.3:复杂的数据类型table,usedata的比较
对于table,usedata和函数(function),lua是做引用的比较,也就是说,只有他们的引用是同一个对象的时候,才认为他们是相等的。
a = {}
a.x = 1
a.y = 0
b = {}
b.x = 1
b.y = 0
c = a
print(c == a) -->output true
print(c == b) -->output false
print(c ~= b) -->output true
3:逻辑操作符
|
|
---|---|
|
|
|
|
|
|
Lua 中的 and 和 or 是不同于 c 语言的。在 c 语言中,and 和 or 只得到两个值 1 和 0,其中 1 表示真,0 表示假。而 Lua 中 and 的执行过程是这样的:
与控制语句一样,所有的逻辑的操作符将false和nil视为假,而将讲其他的任何视为真
a and b 如果 a 为 nil或false,则返回 a,否则返回 b
(如果它的第一个操作数为假,就返回第一个操作数;否则返回第二个操作数)
a or b 如果 a 为 nil,则返回 b,否则返回 a(如果它的第一个操作数为真了,就返回第一个操作数了,否则返回第二个操作数)
print(4 and 5) -->output 5
print(nil and 13) -->output nil
print(false and 13) -->output false
print(4 or 5) -->output 4
print(false or 5) -->output 5
4:字符串连接
4.1:
要在lua连接2个字符串,可以使用操作符 “..” (2个点)。如果其任意一个操作符是数字的话,lua会将这个数字转换为一个字符串
print("hello " .. "world") -->output hello world
print(0 .. 1) -->output 01
4.2:
lua中的字符串是不可变的值(immutable value)。连接操作符只会创建一个新的字符串,而不会对原操作数进行任何修改。
a = "hello"
print(a .. " world") -->output hello world
print(a) -->output hello
4.3:
由于 Lua 字符串本质上是只读的,因此字符串连接运算符几乎总会创建一个新的(更大的)字符串。这意味着如果有很多这样的连接操作(比如在循环中使用 .. 来拼接最终结果),则性能损耗会非常大。在这种情况下,推荐使用 table 和 table.concat() 来进行很多字符串的拼接,例如:
local pieces = {}
for i, elem in ipairs(my_list) do
pieces[i] = my_process(elem)
end
local res = table.concat(pieces)
5:优先级
|
---|
|
|
|
|
|
|
|
|
a + i < b/2 + 1 <--> (a+i) < ((b/2) + 1)
5+x^2*8 <--> 5+ ((x^2)*8)
a (a -(x^2)
x^y^z <--> x^(y^z)
在二元操作符中,除了指数操作符”^” 和连接操作符 “..” 是”右结合”的,其他的都是”左结合”
6:table构造式(table constructor)
table的构造式有3种方式。
(1)空构造方式,用于创建一个空的table,构造式还可以用于初始化数组。
days = {
"sunday","moday","tuesday","wednesday",
"thursday","friday","saturday"
}
print(days[1]) -->output sunday
(2)lua还提供了一种特殊的语法用于初始化记录风格的table
a = {x = 10,y = 20}
-- 等效下面的代码
a = {}
a.x = 10
a.y = 20
(3)在一个构造式中还可以用分号代替逗号。通常会将分号用于分隔构造式中不同的成分。例如将列表部分与记录部分明显的区分开来:
{x=10 ,y =45 ; "one" , "two" , "three"}
7:三目运算符实现
lua中 三目运算符的实现
a ? b : c
(a and b) or c
a为true 则 (a and b) <==> b
a为false 或 nil时 (a and b) <==> a
又 a or c <==> a
所以
(a and b) or c <==> a ? b : c