Lua 的算術(shù)運(yùn)算符如下表所示:
算術(shù)運(yùn)算符 | 說(shuō)明 |
---|---|
+ | 加法 |
- | 減法 |
* | 乘法 |
/ | 除法 |
^ | 指數(shù) |
% | 取模 |
示例代碼:test1.lua
print(1 + 2) -->打印 3
print(5 / 10) -->打印 0.5。 這是Lua不同于c語(yǔ)言的
print(5.0 / 10) -->打印 0.5。 浮點(diǎn)數(shù)相除的結(jié)果是浮點(diǎn)數(shù)
-- print(10 / 0) -->注意除數(shù)不能為0,計(jì)算的結(jié)果會(huì)出錯(cuò)
print(2 ^ 10) -->打印 1024。 求2的10次方
local num = 1357
print(num % 2) -->打印 1
print((num % 2) == 1) -->打印 true。 判斷num是否為奇數(shù)
print((num % 5) == 0) -->打印 false。判斷num是否能被5整數(shù)
關(guān)系運(yùn)算符 | 說(shuō)明 |
---|---|
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
== | 等于 |
~= | 不等于 |
示例代碼:test2.lua
print(1 < 2) -->打印 true
print(1 == 2) -->打印 false
print(1 ~= 2) -->打印 true
local a, b = true, false
print(a == b) -->打印 false
注意:Lua 語(yǔ)言中“不等于”運(yùn)算符的寫(xiě)法為:~=
在使用“==”做等于判斷時(shí),要注意對(duì)于 table, userdate 和函數(shù), Lua 是作引用比較的。也就是說(shuō),只有當(dāng)兩個(gè)變量引用同一個(gè)對(duì)象時(shí),才認(rèn)為它們相等??梢钥聪旅娴睦樱?/p>
local a = { x = 1, y = 0}
local b = { x = 1, y = 0}
if a == b then
print("a==b")
else
print("a~=b")
end
---output:
a~=b
由于 Lua 字符串總是會(huì)被“內(nèi)化”,即相同內(nèi)容的字符串只會(huì)被保存一份,因此 Lua 字符串之間的相等性比較可以簡(jiǎn)化為其內(nèi)部存儲(chǔ)地址的比較。這意味著 Lua 字符串的相等性比較總是為 O(1). 而在其他編程語(yǔ)言中,字符串的相等性比較則通常為 O(n),即需要逐個(gè)字節(jié)(或按若干個(gè)連續(xù)字節(jié))進(jìn)行比較。
邏輯運(yùn)算符 | 說(shuō)明 |
---|---|
and | 邏輯與 |
or | 邏輯或 |
not | 邏輯非 |
Lua 中的 and 和 or 是不同于 c 語(yǔ)言的。在 c 語(yǔ)言中,and 和 or 只得到兩個(gè)值 1 和 0,其中 1 表示真,0 表示假。而 Lua 中 and 的執(zhí)行過(guò)程是這樣的:
a and b
如果 a 為 nil,則返回 a,否則返回 b;a or b
如果 a 為 nil,則返回 b,否則返回 a。示例代碼:test3.lua
local c = nil
local d = 0
local e = 100
print(c and d) -->打印 nil
print(c and e) -->打印 nil
print(d and e) -->打印 100
print(c or d) -->打印 0
print(c or e) -->打印 100
print(not c) -->打印 true
print(not d) -->打印 false
注意:所有邏輯操作符將 false 和 nil 視作假,其他任何值視作真,對(duì)于 and 和 or,“短路求值”,對(duì)于 not,永遠(yuǎn)只返回 true 或者 false。
在 Lua 中連接兩個(gè)字符串,可以使用操作符“..”(兩個(gè)點(diǎn))。如果其任意一個(gè)操作數(shù)是數(shù)字的話(huà),Lua 會(huì)將這個(gè)數(shù)字轉(zhuǎn)換成字符串。注意,連接操作符只會(huì)創(chuàng)建一個(gè)新字符串,而不會(huì)改變?cè)僮鲾?shù)。也可以使用 string 庫(kù)函數(shù) string.format
連接字符串。
print("Hello " .. "World") -->打印 Hello World
print(0 .. 1) -->打印 01
str1 = string.format("%s-%s","hello","world")
print(str1) -->打印 hello-world
str2 = string.format("%d-%s-%.2f",123,"world",1.21)
print(str2) -->打印 123-world-1.21
由于 Lua 字符串本質(zhì)上是只讀的,因此字符串連接運(yùn)算符幾乎總會(huì)創(chuàng)建一個(gè)新的(更大的)字符串。這意味著如果有很多這樣的連接操作(比如在循環(huán)中使用 .. 來(lái)拼接最終結(jié)果),則性能損耗會(huì)非常大。在這種情況下,推薦使用 table 和 table.concat()
來(lái)進(jìn)行很多字符串的拼接,例如:
local pieces = {}
for i, elem in ipairs(my_list) do
pieces[i] = my_process(elem)
end
local res = table.concat(pieces)
當(dāng)然,上面的例子還可以使用 LuaJIT 獨(dú)有的 table.new
來(lái)恰當(dāng)?shù)爻跏蓟?pieces
表的空間,以避免該表的動(dòng)態(tài)生長(zhǎng)。這個(gè)特性我們?cè)诤竺孢€會(huì)詳細(xì)討論。
Lua 操作符的優(yōu)先級(jí)如下表所示(從高到低):
優(yōu)先級(jí) |
---|
^ |
not # - |
* / % |
+ - |
.. |
< > <= >= == ~= |
and |
or |
示例:
local a, b = 1, 2
local x, y = 3, 4
local i = 10
local res = 0
res = a + i < b/2 + 1 -->等價(jià)于res = (a + i) < ((b/2) + 1)
res = 5 + x^2*8 -->等價(jià)于res = 5 + ((x^2) * 8)
res = a < y and y <=x -->等價(jià)于res = (a < y) and (y <= x)
若不確定某些操作符的優(yōu)先級(jí),就應(yīng)顯示地用括號(hào)來(lái)指定運(yùn)算順序。這樣做還可以提高代碼的可讀性。