Lua(二)——表達式

Lua的表達式中能夠包含數字常量、字面字符串、變量、一元和二元操做符及函數調用。表達式中還能夠包括函數定義和table構造式。python

1. 算數操做符

1.1 二元算數操做符
+   加
-   減
*   乘
/   除
^   指數
%   取模

加減乘除沒必要多說,與其餘編程語言相同。在lua中能夠用^計算指數:編程

print(4 ^ 2)  -- 16
print(4 ^ 1 / 2)  -- 2

%用於取模,和其餘語言並無不一樣。在lua中可使用以下方式決定保留幾位小數:編程語言

num = math.pi  -- 3.1415926535898
print(num - num % 1)  -- 3 整數部分
print(num - num % 0.01)  -- 3.14 保留兩位小數
print(num - num % 1e-N)  -- 保留N位小數,N爲非負整數

以這種方式保留小數不會出現進位的狀況(即「五入」)。在其餘語言中也可使用這種方式,只是因爲單精度浮點數存在四捨五入的問題,可能會形成一些偏差。在JavaScriptpython中,ide

num = 3.1415926535898
// JavaScript
num.toFixed(N)  // 保留N位小數,N爲非負整數,默認N=0,自動四捨五入
Math.round(num * 1e+N) / 1e+N  // 保留N位小數,N爲非負整數,自動四捨五入

# python
round(num, N)  # 保留N位小數,N爲非負整數,默認N=0,自動四捨五入
"%.Nf" % num  # 保留N位小數,N爲非負整數,自動四捨五入

另外,在lua中沒有C/C++/Java/JavaScript/Python中的函數

+=
-=
*=
/+
%=

運算符,在編碼時需留意。編碼

1.2 一元算數操做符
-   負號

2. 關係操做符

lua中有如下關係操做符,用來進行比較操做:lua

<   小於
>   大於
<=  小於等於
>=  大於等於
==  等於
~=  不等於

全部比較操做的結果都是true或false。須要注意如下幾點:spa

  1. 和其餘大多數編程語言不一樣,不等於比較符爲~=,而不是!=code

  2. nil只與其自身相等;blog

  3. lua在比較操做時不會作自動轉型,類型不一樣的兩個值永遠不等。在遇到string和number比較時,lua會拋出錯誤;

  4. table/function/userdata三種類型是作引用比較的,即 a = {} a.x = 1 b = {} b.x = 1 print(a == b) -- false

3. 邏輯操做符

python徹底相同,lua使用以下保留字做爲邏輯操做符:

and 與
or  或
not 非

關於運算符要注意一下幾點:

  1. Lua(一)——類型與值咱們就提到過,lua只將false和nil視爲假,其餘任何值包括0與空字符串都視爲真;

  2. lua中的and/or爲短路與和短路或,所謂短路,是指一旦邏輯判斷結果已定時不會繼續向後作判斷,這樣帶來的好處是在遇到type(v) == "table" and v.tag="h1"這樣的表達式時不會致使運行錯誤;

  3. python相同,lua中沒有C/Java/JavaScript中的三目運算符(max = a > b ? a : b),如想達到三目運算符的效果,經過以下方式實現便可:

# python
max = a if a > b else b

-- lua
max = (a > b) and a or b  -- 此狀況下a必須爲真,不然實現不了三目運算符的功能
if a > b then max = a else max = b end

4. 操做符優先級

這裏咱們沒有列出操做符的優先級,也不建議去刻意記憶該優先級,任何狀況下都建議使用()解決優先級問題,既不會出錯,又能提升代碼的可讀性。

5. table構造式

一樣,在Lua(一)——類型與值咱們就提到過lua中table類型的初始化及賦值方法,但初始化及賦值table遠不止一種方式,如下方式均是合法、正確的:

tableBlank = {}
tableBlank.hobbies = {"basketball", "ping-pong", "volleyball"}
tableBlank["school"] = "BIT"
tableBlank[-100] = -100  -- 這種方式可使用負數/特殊符號做爲key
tableBlank["+"] = "add"
print(tableBlank.hobbies[1])  -- basketball
print(tableBlank[-100])  -- -100
print(tableBlank["+"])  -- add

tableWeek = {"Sunday", "Monday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
for i = 1, #tableWeek do
    print(tableWeek[i])
end
--[[
Sunday
Monday
...
Saturday
--]]

tableMixed = {name="Tom", sex="male", age=20, 176, 64.5, [0]="zero"}
print(tableMixed.name)  -- Tom
print(tableMixed.sex)  -- male
print(tableMixed[1])  -- 176
print(tableMixed[0])  -- zero

除了初始化及賦值,關於table還有兩個相似「語法糖」知識點:

  1. 在table構造式的最後一個元素後寫逗號是合法、正確的,如tableDot = {[1]="red", [2]="green",}。這對於要生成table的lua程序來講很靈活,無需區別對待最後一個元素;

  2. 在table構造式中可使用;來代替,,二者做用徹底等同,如tableSymbol = {name="Lucy";sex="male",age=20}

和函數相關的內容咱們放到以後的博客中進行講解,敬請關注。

完。

相關文章
相關標籤/搜索