【Lua 筆記】運算子 - part 2

由於有款遊戲叫做 CSO(Counter-Strike Online),內建模式創世者模式(Studio)新增使用 Lua 及其遊戲的 API,所以突發奇想製作這個筆記。

這個筆記會在一開始先著重純粹的程式設計自學,在最後的章節才會與 CSO 遊戲 API 進行應用。

運算子(Operator)

運算子(Operator),是用來告訴直譯器來執行特定的數學或邏輯運算之符號。Lua 共有以下這幾種運算子:

  • 算術運算子(Arithmetic Operator)
  • 關係運算子(Relational Operator)
  • 邏輯運算子(Logical Operator)

運算子,筆者用一個簡單的例子來讓你理解:

1 + 1

1 被稱為是運算元(operand),是要拿來被運算的單元。

+ 被稱為運算子(operator),在上述例子中是拿來當作數學運算的符號。

1 + 1,整體被稱為是一種運算式(expression),運算式就是運算元+運算子,而運算式也有人叫做表達式,都可以。

算術運算子(Arithmetic Operator)

簡單來說,算術運算子就是拿來做四則運算的運算子。

以下表格,假設 A = 10,B = 20。

運算子敘述範例
+加法A + B = 30
-減法A - B = -10
*乘法A * B = 200
/除法A / B = 0.5
%取模(mod),取餘數。A % B = 10
^乘冪(指數)A ^ 2 = 100
-負號-A = -10
//整除運算子(lua 5.3 版本支援),簡單來說就只是取商數。10 // 3 = 3

表格來源:Lua 运算符 | 菜鸟教程

看到這表格,不禁讓筆者覺得 Lua 跟 Python 其實是有幾分像的,比如說兩者都是直譯式語言,同樣有 // 運算子。

我們來做個範例(改自菜鳥教程):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
a = 21
b = 10
c = a + b
print("Line 1 - a + b : ", c)
c = a - b
print("Line 2 - a - b : ", c)
c = a * b
print("Line 3 - a * b : ", c)
c = a / b
print("Line 4 - a / b : ", c)
c = a % b
print("Line 5 - a % b : ", c)
c = a ^ 2
print("Line 6 - a ^ 2 : ", c)
c = -a
print("Line 7 - -a : ", c)
c = a // b
print("Line 8 - a // b : ", c)

輸出結果:

1
2
3
4
5
6
7
8
Line 1 - a + b :    31
Line 2 - a - b : 11
Line 3 - a * b : 210
Line 4 - a / b : 2.1
Line 5 - a % b : 1
Line 6 - a ^ 2 : 441.0
Line 7 - -a : -21
Line 8 - a // b : 2

上面你可能注意到了,c = a + b 這個動作,這個表示將 a + b 的值相加過後,指定給 c。

如果是變成這樣:a = a + 1

則是表示,a + 1 過後,指定給 a。

關係運算子/比較運算子(Relational Operator/Comparison Operator)

關係運算子或稱比較運算子,總之你把它想成是一個專門用來比大小的運算子就行XD。

以下表格,假設 A = 10,B = 20。

運算子敘述範例
==比較兩個運算元是否數值相同,相同 -> 回傳 true;不相同 -> 回傳 false(A == B) 是 false
~=比較兩個運算元是否數值不相同,不相同 -> 回傳 true;相同 -> 回傳 false(A ~= B) 是 true
>比較運算子左邊的運算元是否大於右邊的,大於 -> 回傳 true;小於 -> 回傳 false(A > B) 是 false
<比較運算子左邊的運算元是否小於右邊的,小於 -> 回傳 true;大於 -> 回傳 false(A < B) 是 true
>=比較運算子左邊的運算元是否大於或等於右邊的,是 -> 回傳 true;否 -> 回傳 false(A >= B) 是 false
<=比較運算子左邊的運算元是否小於或等於右邊的,是 -> 回傳 true;否 -> 回傳 false(A <= B) 是 true

表格來源:Lua 运算符 | 菜鸟教程

1
2
3
4
5
6
7
8
A = 10
B = 20
print(A == B)
print(A ~= B)
print(A > B)
print(A < B)
print(A >= B)
print(A <= B)

輸出結果:

1
2
3
4
5
6
false
true
false
true
false
true

邏輯運算子(Logical Operator)

邏輯運算子,在 lua 中分為 AND、OR、NOT。可以用我們之前在高中數學學過的文氏圖來表示,如下:

image

圖源:溫氏圖 - 維基百科,自由嘅百科全書

以下表格,假設 A = true, B = false。

運算子敘述範例
and邏輯 AND 運算子。代表兩個條件都要是 true,才會是 true,其中之一不能有 false。(A and B) 是 false。
or邏輯 OR 運算子。代表其中之一的條件是 true,才會是 true,若兩個條件都是 false,會是 false。(A or B) 是 true。
not邏輯 NOT 運算子。用來反轉條件的運算子。not(A) 是 false。

表格改自:Lua 运算符 | 菜鸟教程

1
2
3
4
5
6
7
A = true
B = false
print(A and B) -- false
print(A or B) -- true
print(not A) -- false
print(not (A and B)) -- true
print(not (A or B)) -- false

輸出結果:

1
2
3
4
5
false
true
false
true
false

若你還是不懂邏輯的概念,請看以下表格:

image

image

image

圖源:運算子 operator - Python 教學 | STEAM 教育學習網

其他的運算子(others)

運算子敘述範例
..連接兩個字串a..b ,其中 a 為 “Hello “,b 為 “World”, 輸出結果為 “Hello World”。
#一元運算子,回傳字串或 table 的長度#”Hello” 回傳 5

表格來源:Lua 运算符 | 菜鸟教程

1
2
3
4
5
6
a = "Hello "
b = "World!"

print("The string combine after is : ", a .. b)

print("The string a length is : ", #a)

輸出結果:

1
2
The string combine after is :   Hello World!
The string a length is : 6

總結

今日已學:

  • 算術運算子(Arithmetic Operator)
  • 關係運算子(Relational Operator)
  • 邏輯運算子(Logical Operator)

是的沒錯,Lua 運算子就這麼少,所以才說它好學。

算術運算子:四則運算。
關係運算子:比大小。
邏輯運算子:AND、OR、NOT,分別是「兩條件成立(true),否則不成立(false)」、「兩條件其中之一成立即成立(true),否則不成立(false)」、「反轉邏輯狀態(true 變成 false,false 變成 true)」。

..運算子:連接兩字串,可以想像成 Python 當中的 +。

運算子:可以回傳字串的長度。

參考資料