【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)