官术网_书友最值得收藏!

4.1 布爾邏輯

第3章介紹的bool類型可以有兩個值:true或false。這種類型常用于記錄某些操作的結果,以便操作這些結果。特別是,bool類型可用于存儲比較的結果。

注意:19世紀中葉的英國數學家喬治·布爾(George Boole)為布爾邏輯奠定了基礎。

考慮下述情形(如本章引言所述):要根據變量myVal是否小于10來確定是否執行代碼。為此,需要確定語句“myVal小于10”的真假,即需要了解比較的布爾結果。

布爾比較需要使用布爾比較運算符(也稱為關系運算符),如表4-1所示。

表4-1 布爾比較運算符

在表4-1中,var1都是bool類型的變量,var2和var3則可以是不同類型。

在代碼中,可以對數值使用這些運算符:

        bool isLessThan10;
        isLessThan10 = myVal < 10;

如果myVal存儲的值小于10,這段代碼就給isLessThan10賦予true值,否則賦予false值。也可以對其他類型使用這些比較運算符,例如字符串:

        bool isBenjamin;
        isBenjamin = myString == "Benjamin";

如果myString存儲的字符串是Benjamin, isBenjamin的值就為true。也可以對布爾值使用這些運算符:

        bool isTrue;
        isTrue = myBool == true;

但只能使用==和!=運算符。

注意:一個常見的代碼錯誤是,無意間假定由于val1 < val2是false,所以val1 > val2為true。如果val1 == val2,則這兩條語句都是false。

&和 | 運算符也有兩個類似的運算符,稱為條件布爾運算符(見表4-2)。

表4-2 條件布爾運算符

這些運算符的結果與&和 | 完全相同,但得到結果的方式有一個重要區別:其性能比較好。兩者都是檢查第一個操作數的值(表4-2中的var2),如果已經能判斷結果,就根本不處理第二個操作數(表4-2中的var3)。

如果&&運算符的第一個操作數是false,就不需要考慮第二個操作數的值了,因為無論第二個操作數的值是什么,其結果都是false。同樣,如果第一個操作數是true, || 運算符就返回true,不必考慮第二個操作數的值。

4.1.1 布爾按位運算符和賦值運算符

使用布爾賦值運算符可以把布爾比較與賦值組合起來,其方式與第3章中的數學賦值運算符(+=、*=等)相同。布爾賦值運算符如表4-3所示。當表達式使用賦值(=)和按位運算符(&、|、^)時,就使用所比較數值的二進制表示來計算結果,而不是使用整數、字符串或相似的值。

表4-3 布爾賦值運算符

例如,等式var1 ^ = var2類似于var1 = var1 ^ var2,其中var1 = true、var2 = false。當比較false的二進制表示0000與true(一般不是0000的任何值,通常是0001)時,var1就設置為true。

注意:&=和 |= 賦值運算符并不使用&&和 || 條件布爾運算符,即無論賦值運算符左邊的值是什么,都處理所有操作數。

在下面的示例中,用戶鍵入一個整數,然后代碼使用該整數執行各種布爾運算。

試一試:使用布爾運算符: Ch04Ex01\Program.cs

(1)在目錄C:\BegVCSharp\Chapter04下創建一個新的控制臺應用程序Ch04Ex01。

(2)將以下代碼添加到Program.cs中:

            static void Main(string[] args)
            {
              WriteLine("Enter an integer:");
              int myInt = ToInt32(ReadLine());
              bool isLessThan10 = myInt < 10;
              bool isBetween0And5 = (0 <= myInt) && (myInt <= 5);
                WriteLine($"Integer less than 10? {isLessThan10}");
                WriteLine($"Integer between 0 and 5? {isBetween0And5}");
                WriteLine($"Exactly one of the above is true?
                          {isLessThan10 ^ isBetween0And5}");
                ReadKey();
              }

(3)運行應用程序,出現提示時,輸入一個整數,結果如圖4-1所示。

圖4-1

示例說明

前兩行代碼使用前面介紹的技術,提示并接受一個整數值:

        WriteLine("Enter an integer:");
        int myInt = ToInt32(ReadLine());

使用Convert.ToInt32()從字符串輸入中得到一個整數。Convert.ToInt32()是另一個類型轉換命令,與前面使用的Convert.ToDouble()命令屬于同一系列。ToInt32()和ToDouble()方法是System. Convert靜態類的一部分。如第3章所述,自從C# 6之后,就可以在包括的名稱空間列表中包含using static System.Convert類,直接訪問靜態類(在這個例子中是System.Convert)的方法。還要注意,沒有檢查用戶是否輸入了一個整數。如果提供了不是整數的值,例如字符串,在試圖執行轉換時會發生異常。可以使用try{ }…catch{ }塊處理這種情況,或在執行轉換之前使用GetType()方法,檢查輸入的值是不是一個整數。這兩種方法將在后續章節討論。

接著聲明兩個布爾變量isLessThan10和isBetween0And5,并賦值,其中的邏輯匹配其名稱中的描述:

        bool isLessThan10 = myInt < 10;
        bool isBetween0And5 = (0 <= myInt) && (myInt <= 5);

接著在下面的3行代碼中使用這些變量,前兩行代碼輸出它們的值,第3行對它們執行一個操作,并輸出結果。在執行這段代碼時,假定用戶輸入了7,如圖4-1所示。

第一個輸出是操作myInt < 10的結果。如果myInt是6,則它小于10,因此結果為true。如果MyInt的值是10或更大,就會得到false。

第二個輸出涉及較多計算:(0 <= myInt) && (myInt <= 5),其中包含兩個比較操作,用于確定myInt是否大于或等于0,且小于或等于5。接著對結果進行布爾AND操作。輸入數字6,則(0 <=myInt)返回true,而(myInt <= 5)返回false,最終結果就是(true) && (false),即false,如圖4-1所示。

最后,對兩個布爾變量isLessThan10和isBetween0And5執行邏輯異或操作。如果一個變量的值是true,另一個是false,則代碼返回true。所以只有myInt是6、7、8或9,才返回true,本例輸入的是6,所以結果是true。

4.1.2 運算符優先級的更新

現在要考慮更多的運算符,所以應更新第3章中的運算符優先級表,把它們包括在內,如表4-4所示。

表4-4 運算符優先級(更新后)

該表增加了好幾個級別,但它明確定義了下述表達式該如何計算:

        var1 = var2 <= 4 && var2 >= 2;

其中&&運算符在<=和>=運算符之后執行(在這行代碼中,var2是一個int值)。

這里要注意的是,添加括號可以使這樣的表達式看起來更清晰。編譯器知道用什么順序執行運算符,但人們常會忘記這個順序(有時可能想改變這個順序)。上述表達式也可以寫為:

        var1 = (var2 <= 4) && (var2 >= 2);

通過明確指定計算的順序就解決了這個問題。

主站蜘蛛池模板: 青阳县| 子长县| 棋牌| 安龙县| 荆门市| 库车县| 独山县| 涞水县| 沧州市| 富裕县| 晋江市| 麻城市| 临邑县| 资溪县| 玉屏| 合川市| 陕西省| 江西省| 育儿| 沐川县| 宝鸡市| 海口市| 弥渡县| 阜南县| 赣州市| 乐清市| 三江| 彝良县| 华蓥市| 金门县| 黎平县| 武威市| 大竹县| 佛学| 榆中县| 邮箱| 台湾省| 柞水县| 威信县| 交城县| 南昌市|