---
# System prepended metadata

title: 【Lua 筆記】運算子 - part 2
tags: [Lua, 程式語言]

---

【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。可以用我們之前在高中數學學過的文氏圖來表示，如下：

![image](https://hackmd.io/_uploads/BkgxqJiSA.png)

圖源：[溫氏圖 - 維基百科，自由嘅百科全書](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
```

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

![image](https://hackmd.io/_uploads/rJxsskjrR.png)

![image](https://hackmd.io/_uploads/HkS2syiBA.png)

![image](https://hackmd.io/_uploads/Skh3oJsHR.png)

圖源：[運算子 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)