邏輯運算主要針對運算元之間,或是運算式的運算結果進行比對運算,邏輯運算所回傳的結果通常是一個 true 或是 false 布林值,關聯運算則用來指出兩個運算元之間的關係,例如 x 與 y 是否相等,或是 a 是否大於b 等等。邏輯與關聯運算子可進一步結合其他運算式,形成更複雜的運算式。
關聯運算子
關聯運算子提供兩個數值的比較運算,這類運算子完成運算元的比較運算之後,便傳回一個代表運算結果的布林值,相關的運算子列舉如下表:
表列的運算子原理均相同,當運算結果成立時,回傳一個 true 的布林值,反之則回傳 false 的布林值。
以下的運算式比較常數值 4 與 5 的大小,並且將比較結果 false 回傳儲存於布林型別變數 b 。
以上用於比較的字串是一種物件型別,而無論 C# 內建類別所產生的物件型別或是自訂型別,同樣也可以比照此方式進行物件的相等比較。
通常在運算式中,你可以宣告一個布林型別的變數,儲存關聯運算子回傳的結果,藉以判斷是否繼續執行某些動作,當你使用這些運算子的時候,要特別注意 == 運算子比較左右兩邊的運算元是否相等,相等則回傳一個 true 布林值,否則回傳 false ,此與設值運算子 = 將右邊運算元的值指定給左邊運算元的運算並不相同,必須小心避免混用。
邏輯布林運算子與short-circuit運算
邏輯運算子針對兩個布林值作運算,而回傳的結果亦是一個布林值,例如底下的程式碼:
我們先來看看一般邏輯運算子,列舉說明如下:
為了方便理解,我們將其運算邏輯整理如下表,其中 X 以及 Y 分別為左右運算元。
以下示範布林值以及布林運算式,使用於邏輯運算所產生的結果。
邏輯運算的運算元除了單純的 true 或是 false ,也可以是一段運算式經過運算之後的運算結果,緊接著分別將上述的單一運算式結果,再進行一次運算,原理與單純的布林值運算相同,以下是輸出結果:
由於 short-circuit 運算只有在第一個運算元通過運算規則之後,才會進行第二個運算元的運算,因此相較於一般邏輯運算而言,此種運算可以獲得較佳的效率。
關聯運算子
關聯運算子提供兩個數值的比較運算,這類運算子完成運算元的比較運算之後,便傳回一個代表運算結果的布林值,相關的運算子列舉如下表:
運算子 | 關聯邏輯 | 運算子 | 關聯邏輯 |
---|---|---|---|
== | 等於 | != | 不等於 |
> | 大於 | >= | 大於等於 |
< | 小於 | <= | 小於等於 |
表列的運算子原理均相同,當運算結果成立時,回傳一個 true 的布林值,反之則回傳 false 的布林值。
以下的運算式比較常數值 4 與 5 的大小,並且將比較結果 false 回傳儲存於布林型別變數 b 。
bool b ; b = 4>5 ;如同其他運算子,關聯運算也可以比較兩個變數值的大小關係,就如同一般的數學比較運算,而除了基本型別,其中的不等於運算子 != 以及等於運算子 = = 這兩個運算子亦經常被使用在物件型別資料的比較上面,以了解這兩種型別是否相等,以下的程式片段示範兩個字串物件的比較操作。
String strFirst = "one" ; String strSecond = "One" ; String strThird = "one" ; System.out.println(strFirst == strSecond) ; System.out.println(strFirst == strThird) ;第一個字串 strFirst 與第二個字串 strSecond 的字母大小寫相異,因此比較結果為false ,第一個字串 strFirst 與第三個字串 strThird 的內容完全相同,因此比較結果為true 。
以上用於比較的字串是一種物件型別,而無論 C# 內建類別所產生的物件型別或是自訂型別,同樣也可以比照此方式進行物件的相等比較。
通常在運算式中,你可以宣告一個布林型別的變數,儲存關聯運算子回傳的結果,藉以判斷是否繼續執行某些動作,當你使用這些運算子的時候,要特別注意 == 運算子比較左右兩邊的運算元是否相等,相等則回傳一個 true 布林值,否則回傳 false ,此與設值運算子 = 將右邊運算元的值指定給左邊運算元的運算並不相同,必須小心避免混用。
邏輯布林運算子與short-circuit運算
邏輯運算子針對兩個布林值作運算,而回傳的結果亦是一個布林值,例如底下的程式碼:
X && Y X & YX與Y均是布林值,其回傳的運算結果亦是布林值,細節我們稍後再談,此類型的運算子有兩組,一般邏輯運算以及short-circuit運算:
分類 | 說明 |
---|---|
一般邏輯運算 | 等於 |
short-circuit運算 | 包含 & 以及 | 的 short-circuit 版本, && 與 || ,兩者的邏輯運算原理相同,但是 && 與 || 的效率比一般的邏輯運算子佳。 |
我們先來看看一般邏輯運算子,列舉說明如下:
- AND(&):邏輯AND運算,只有當左右兩個運算元同時均為 true 的時候,才會回傳true 的結果,否則運算結果一律為 false 。
- OR(|):邏輯 OR 運算,只有當兩個運算元的值均為 false,結果才會傳回false,否則結果一律為true。
- XOR(^):邏輯 XOR 運算,這種邏輯運算只要兩個運算元中出現一個 true 值,一個為 false ,便回傳 true的結果,反之若同時為 true 或同時為 false ,則回傳值為 false 。
- NOT(!):邏輯 NOT 運算,如果運算元為 true 則將其值反轉為 false 作輸出,反之亦然。
為了方便理解,我們將其運算邏輯整理如下表,其中 X 以及 Y 分別為左右運算元。
X | Y | X & X | X |Y | X ^Y | !Y |
---|---|---|---|---|---|
false | false | false | false | false | true |
true | false | false | true | true | true |
false | true | false | true | true | false |
true | true | true | true | false | false |
以下示範布林值以及布林運算式,使用於邏輯運算所產生的結果。
class Program { static void Main(string[] args) { bool x = true; bool y = false; Console.WriteLine("x =" + x); Console.WriteLine("y =" + y); bool xory = x | y; Console.WriteLine("x | y:" + xory); bool xandy = x & y; Console.WriteLine("x & y:" + xandy); bool xoy = (x & y) | (x | y); Console.WriteLine("(x & y) | (x | y) :" + xoy); bool xny = (x & y) & (x | y); Console.WriteLine("(x & y) & (x | y) :" + xny); Console.ReadLine(); } }分別定義 true 以及 false 的 bool 變數 - x 與 y,然後針對這兩個變數進行邏輯運算。
邏輯運算的運算元除了單純的 true 或是 false ,也可以是一段運算式經過運算之後的運算結果,緊接著分別將上述的單一運算式結果,再進行一次運算,原理與單純的布林值運算相同,以下是輸出結果:
x =True y =False x | y:True x & y:False (x & y) | (x | y) :True (x & y) & (x | y) :False邏輯布林運算子當中, & 以及 | 包含了另外一個稱之為 short-circuit 的版本, && 與|| ,這兩者的運算邏輯均相同,主要的差異在於 short-circuit 於左邊的運算元為 false 的時候,便不再繼續往右邊的運算元作運算,直接回傳 false 的結果,例如底下的運算式:
X && Y如果 X 是 false ,則整個邏輯運算便馬上結束, Y 的部份被直接忽略掉。同樣的,對於 || 而言,若是左邊的運算元 X 為 true ,右邊的 Y 將不會被進一步作驗証,直接回傳 true 的結果。
由於 short-circuit 運算只有在第一個運算元通過運算規則之後,才會進行第二個運算元的運算,因此相較於一般邏輯運算而言,此種運算可以獲得較佳的效率。
沒有留言:
張貼留言