關聯與邏輯運算

邏輯運算主要針對運算元之間,或是運算式的運算結果進行比對運算,邏輯運算所回傳的結果通常是一個 true 或是 false 布林值,關聯運算則用來指出兩個運算元之間的關係,例如 x 與 y 是否相等,或是 a 是否大於b 等等。邏輯與關聯運算子可進一步結合其他運算式,形成更複雜的運算式。

關聯運算子

關聯運算子提供兩個數值的比較運算,這類運算子完成運算元的比較運算之後,便傳回一個代表運算結果的布林值,相關的運算子列舉如下表:

運算子關聯邏輯運算子關聯邏輯
==等於!=不等於
>大於>=大於等於
<小於<=小於等於

表列的運算子原理均相同,當運算結果成立時,回傳一個 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 & Y
X與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 分別為左右運算元。

XYX & XX |YX ^Y!Y
falsefalsefalsefalsefalsetrue
truefalsefalsetruetruetrue
falsetruefalsetruetruefalse
truetruetruetruefalsefalse

以下示範布林值以及布林運算式,使用於邏輯運算所產生的結果。
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 運算只有在第一個運算元通過運算規則之後,才會進行第二個運算元的運算,因此相較於一般邏輯運算而言,此種運算可以獲得較佳的效率。




沒有留言: