考慮下述情形:要根據變數var是否小於10,來確定是否執行代碼。為此,需要確定語句"var小於10"的真假(小於為真,既true;不小於則為假,既false),即需要知道比較的布爾結果
布爾比較需要使用布爾比較子(也稱為關係運算子),如下表所示。這裡var1都是bool類型的變數,var2 和 var3則可以是各種類型。
運算子 |
類別 |
樣本運算式 |
結果 |
== |
二元 |
var1 = var2== var3; |
如果var2等於var3,var1的值就是true,否則為false |
!= |
二元 |
var1 = var2 != var3; |
如果var2不等於var3,var1的值就是true,否則為false |
< |
二元 |
var1 = var2 < var3; |
如果var2小於var3,var1的值就是true,否則為false |
> |
二元 |
var1 = var2 > var3; |
如果var2大於var3,var1的值就是true,否則為false |
<= |
二元 |
var1 = var2 <= var3; |
如果var2小於或等於var3,var1的值就是true,否則為false |
>= |
二元 |
var1 = var2 >= var3; |
如果var2大於或等於var3,var1的值就是true,否則為false |
在代碼中,可以對數值使用這些運算子,如下所示:
int a = 10, b = 11;
bool var9 = a > b; //值為false
如果變數a的值大於變數b的值,這段代碼就給變數var9賦予true值,否則賦予false值。
也可以對其他類型使用這些比較子,例如字串:
string name = "天轟穿";
bool var10 = name == "老田"; //值為false
bool var11 = name != "老田";
如果name儲存的字串是"老田",var10的值就為true。在本例中,name的值是"天轟穿",不等於"老田",所以本例的值為false;猜猜var11的值應該是什嗎?
也可以對布爾值使用這些運算子:
bool var12=false, var13;
var13 = var12 == true; //值為false
但只能使用==和!=運算子。
在處理布爾值時,還有其它一些布林運算子,如下表所示。
運算子 |
類別 |
樣本運算式 |
結果 |
! |
一元 |
var1 = ! var2; |
如果var2是false,var1的值就是true,否則為false(邏輯非) |
& |
二元 |
var1 = var2 & var3; |
如果var2和var3都是true,var1的值就是true,否則為false(邏輯與) |
| |
二元 |
var1 = var2 | var3; |
如果var2或var3是true(或兩者都是),var1的值就是true,否則為false(邏輯或) |
^ |
二元 |
var1 = var2 ^ var3; |
如果var2或var3中有且僅有一個是true,var1的值就是true,否則為false (邏輯異或) |
上面的代碼也可以表述為:
bool var14 = false, var15, var16 = false, var17 = true, var18, var19,var20;
var15 = !var14; //值為true
var18 = var16 & var17; //值為false
//完全用運算式作為對比條件
var19 = 10 > 5 & 7 < 4; //這裡&號兩邊用的是運算式而不是單獨的值,猜下值為多少
string str5 = "天轟穿", str6 = "老田";//申明兩個字串類型變數,下面用來做比較
int sum1 = 10, sum2 = 20; //申明兩個INT類型變數,下面用來做比較
var20 = str5 != str6 & sum1 >= sum2; //值為false
Console.WriteLine("var15={0},var18={1},var19={2},var20={3}"
, var15, var18,var19,var20);
&和 | 運算子也有兩個類似的運算子,稱為條件布林運算子,如下表。
運算子 |
類別 |
樣本運算式 |
結果 |
&& |
二元 |
var1 = var2 && var3; |
如果var2和var3都是true,var1的值就是true,否則為false (邏輯與) |
|| |
二元 |
var1 = var2 || var3; |
如果var2或var3是true(或兩者都是),var1的值就是true,否則為false (邏輯或) |
這些運算子的結果與&和 | 完全相同,但得到結果的方式有一個重要區別:其效能比較好。兩者都是檢查第一個運算元的值(或者運算式產生的值),再根據該運算元的值進行操作,可能根本就不需要第二個運算元的值。
如果&&運算子的第一個運算元是false,就不需要考慮第二個運算元的值了,因為無論第二個運算元的值是什麼,其結果都是false。同樣,如果第一個運算元是true,|| 運算子就返回true,無需考慮第二個運算元的值。但上面的&和 | 運算子卻不是這樣。它們的運算元總是要計算的。
因為運算元的計算是有條件的,如果使用&&和||運算子來代替&和 | ,效能會有一定的提高。在大量使用這些運算子的應用程式中是比較明顯的。作為一個規則,儘可能使用&&和 || 運算子。這些運算子有時用於比較複雜的情形,例如,只有第一個運算元包含某個值時,才計算第二個運算元:
var1 = (var2 != 0) && (var3 / var2 > 2);
如果var2是0,則var3除以var2就會導致"除0錯誤",或者把var1定義為無窮大(對於某些類型如float來說,後者是可能的,也是可以檢測到的)。
小天:既然&&和||的效率更高,上面為什麼會詳細講&和 | 運算子。
老田:是因為這兩種運算子都可以用於對數值執行操作,另外用法都基本一樣,所以就選一個講詳細點了。另外,&和 | 最重要的在於它們處理儲存在變數中的一系列位,而不是變數的值。
由於位元運算對很多初學者來說,很容易暈頭轉向,同時,該知識點也並不妨礙我們對後面的知識的學習(這裡不是說位元運算沒有用)。所以有興趣的朋友可以去參考MSDN的資料。
本文為天轟穿原著,轉載請註明出處及作者!