【Lua 筆記】運算子 - part 2
===
目錄(Table of Contents):
[TOC]
---
由於有款遊戲叫做 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 运算符 | 菜鸟教程](https://www.runoob.com/lua/lua-miscellaneous-operator.html)
看到這表格,不禁讓筆者覺得 Lua 跟 Python 其實是有幾分像的,比如說兩者都是直譯式語言,同樣有 // 運算子。
我們來做個範例(改自菜鳥教程):
```lua=
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)
```
輸出結果:
```
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 运算符 | 菜鸟教程](https://www.runoob.com/lua/lua-miscellaneous-operator.html)
```lua=
A = 10
B = 20
print(A == B)
print(A ~= B)
print(A > B)
print(A < B)
print(A >= B)
print(A <= B)
```
輸出結果:
```
false
true
false
true
false
true
```
### 邏輯運算子(Logical Operator)
---
邏輯運算子,在 lua 中分為 AND、OR、NOT。可以用我們之前在高中數學學過的文氏圖來表示,如下:

圖源:[溫氏圖 - 維基百科,自由嘅百科全書](https://zh-yue.wikipedia.org/wiki/%E6%BA%AB%E6%B0%8F%E5%9C%96)
以下表格,假設 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 运算符 | 菜鸟教程](https://www.runoob.com/lua/lua-miscellaneous-operator.html)
```lua=
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
```
輸出結果:
```
false
true
false
true
false
```
若你還是不懂邏輯的概念,請看以下表格:



圖源:[運算子 operator - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/basic/operator.html)
### 其他的運算子(others)
---
| 運算子 | 敘述 | 範例 |
| -------- | -------- | -------- |
| .. | 連接兩個字串 | a..b ,其中 a 為 "Hello ",b 為 "World", 輸出結果為 "Hello World"。 |
| # | 一元運算子,回傳字串或 table 的長度 | #"Hello" 回傳 5 |
表格來源:[Lua 运算符 | 菜鸟教程](https://www.runoob.com/lua/lua-miscellaneous-operator.html)
```lua=
a = "Hello "
b = "World!"
print("The string combine after is : ", a .. b)
print("The string a length is : ", #a)
```
輸出結果:
```
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 當中的 +。
#運算子:可以回傳字串的長度。
參考資料
---
* [[Lua] 程式設計教學:使用運算子 (Operator) | 開源技術教學](https://opensourcedoc.com/lua-programming/operator/)
* [Lua 运算符 | 菜鸟教程](https://www.runoob.com/lua/lua-miscellaneous-operator.html)