C# Online ! 第十五篇:C# ~ 運算子來嘍 Part III ─ 重要的基礎 『布林邏輯』
大家好!! 這次要跟大家介紹的是『布林邏輯』,這是寫程式的時候,很重要的基礎邏輯,如果活用『布林邏輯』的話,在處理很多程序時,可以讓我們事半功倍喔!! 例如我們想要讓一段程式重複執行幾次,是否達到一定的次數或是判斷條件是否達成,都可以使用到布林邏輯,之前在第八篇內有簡單的提到bool這個型別,這一篇就再介紹一次這個關鍵字與布林邏輯相關的運算子。
bool
bool 關鍵字是 System.Boolean 的別名。它是用來宣告儲存布林值 true 和 false 的變數。布林值通常用來記錄某些操作的結果,特別是,布林值可以存儲比較後的結果。在 C++ 中,bool 型別的值可以轉換成 int 型別的值;換句話說,false 等於零,而 true 則等於非零值。在 C# 中,bool 型別和其他型別之間是不能轉換的。
例如: 我們有一段程式,這一段程式是否要執行,是取決於一個變數的值是否小於10,這時候我們就可以利用是否小於10這個比較後的結果是 true 還是 false 來判斷。
所以在使用『布林邏輯』的時候,要用到一些可以《比較》的運算子,接下來就來介紹這些運算子吧!!
比較運算子與關係運算子:
以下表中的簡單例子,var1 是bool型別,而 var2 與 var3 也許會是不同型別。
運算子 |
名稱 |
類型 |
說明 |
範例 |
結果 |
= = |
等號 比較運算子 |
Binary ( 二元運算子 ) |
對於預先定義的實值型別 (Value Type),等號比較運算子 (= =) 在運算元相等時傳回 true;否則傳回 false。對於 string 以外的參考型別,若兩個運算元參考到同一物件,= = 會傳回 true。對於 string 型別,= = 會比較字串的值。 |
var1 = var2 == var3; |
如果var2等於var3,var1為true,否則var1為false。 |
! = |
不等 比較運算子 |
Binary ( 二元運算子 ) |
在運算元相等時會傳回 false,不相等時傳回 true。所有的型別 (包括字串及物件) 已預先定義不等比較運算子。而對於 string 以外的參考型別,若兩個運算元參考至不同物件,!= 便會傳回 true。針對 string 型別,!= 會比較字串的值。 |
var1 = var2 != var3; |
如果var2不等於var3,var1為true,否則var1為false。 |
< |
小於 關係運算子 |
Binary ( 二元運算子 ) |
所有的數字和列舉型別都定義了「小於」的關係運算子 (<),當第一個運算元小於第二個運算元時會傳回 true;否則傳回 false。使用者定義型別可多載 < 運算子。如果多載 <,則也必須多載 >。當多載二元 (Binary) 運算子時,同時隱含多載其對應的指派運算子 (若有的話)。 |
var1 = var2 < var3; |
如果var2小於var3,var1為true,否則var1為false。 |
> |
大於 關係運算子 |
Binary ( 二元運算子 ) |
所有的數字和列舉型別都定義了「大於」的關係運算子 (>),當第一個運算元大於第二個運算元時會傳回 true,否則傳回 false。使用者定義型別可多載 > 運算子。如果多載 >,則也必須多載 <。當二元 (Binary) 運算子為多載時,同時隱含其對應的指派運算子 (若有的話) 為多載。 |
var1 = var2 > var3; |
如果var2大於var3,var1為true,否則var1為false。 |
< = |
小於或等於 關係運算子 |
Binary ( 二元運算子 ) |
所有的數字型別和列舉型別都定義了「小於或等於」的關係運算子 (<=),如果第一個運算元小於或等於第二個運算元時,會傳回 true;否則會傳回 false。使用者定義型別可以多載 <= 運算子。若 <= 被多載,則 >= 也必須被多載。對整數類資料型別 (Integral Type) 執行的作業,通常也適用於列舉型別。 |
var1 = var2 <= var3; |
如果var2小於或等於var3,var1為true,否則var1為false。 |
> = |
大於或等於 關係運算子 |
Binary ( 二元運算子 ) |
所有的數字型別及列舉型別都定義了「大於或等於」的關係運算子 (>=),如果第一個運算元大於或等於第二個運算元時會傳回 true,其他情形則傳回 false。使用者定義型別可以多載 >= 運算子。如果多載 >=,則<=也必須多載 。對整數類資料型別 (Integral Type) 執行的作業,通常也適用於列舉型別。 |
var1 = var2 >= var3; |
如果var2大於或等於var3,var1為true,否則var1為false。 |
看完運算子的介紹,再來運用這些運算子舉各簡單的例子:
以上的 code 為 ─ isLessThan10 是bool型別,如果 myVal 的值小於10,isLessThan10 的值為 true,如果 myVal 的值 等於 或是 大於 10,isLessThan10 的值為 false。
我們也可以運用這些運算子來做其他型別的比較,像是 string (字串) 型別:
這一段 code 為 ─ isWei 只有在 myString 的值為 ''Wei'' 的時候,才會是 true,否則都是false。
當然我們也可以這樣用:
isTrue 只有在 mybool 為 true 的時候,才會是true,否則為false,這邊要注意的是,用布林值來比較的時候,只能用==(等號比較運算子)或是!=(不等比較運算子)。看完這些例子,有沒有比較清楚了呢?
小提醒:在設定條件判斷的時候要特別小心,不要自相矛盾了,例如以下的陳述式: val1 < val2 is false, val1 > val2 is true. If val1 == val2 ... 那這兩個陳述式都是false了。 |
為了bool而定義的運算子:
運算子 |
名稱 |
類型 |
說明 |
範例 |
結果 |
! |
邏輯負運算子 |
Unary ( 一元運算子 ) |
邏輯負運算子 (!) 是將運算元做否定運算的一元運算子。它是為了 bool 而定義的,只有在其運算元為 false 時才會傳回 true。 |
var1 = !var2; |
如果var2是false,var1為true,如果var2是true,var1則為false。 |
& |
AND運算子 |
Unary、Binary ( 一元或二元 運算子 ) |
一元 & 運算子會傳回運算元的位址 (需要 unsafe 的內容)。 二元 & 運算子已為整數類資料型別及 bool 預先定義其運算方式。對於整數類資料型別,& 會針對其運算元進行邏輯位元 AND 運算。對於 bool 運算元,& 會針對其運算元進行邏輯 AND 運算,也就是說,只有在兩個運算元皆為 true 時,結果才會是 true。 & 運算子會同時評估兩個運算子,不管第一個運算子其值為何。 |
var1 = var2 & var3; |
如果var2和var3都是true的時候,var1才會是true,否則是false。 |
| |
OR運算子 |
Binary ( 二元運算子 ) |
已為整數類資料型別和 bool 預先定義二元 | 運算子。對於整數類資料型別,| 會針對其運算元進行位元 OR 運算。對於 bool 運算元,| 會針對其運算元進行邏輯 OR 運算,也就是說,唯有在兩個運算元皆為 false 時,結果才會是 false。 |
var1 = var2 | var3; |
如果var2或是var3其中一個(或兩個都)是true,var1為true,var2跟var3兩個都是false的時候,var1則為false。 |
^ |
XOR運算子 |
Binary ( 二元運算子 ) |
已為整數類資料型別和 bool 預先定義二元 ^ 運算子。對於整數型別,^ 會針對其運算元進行位元 (Bitwise) 互斥-OR 運算。對於 bool 運算元,^ 會針對其運算元進行邏輯 Exclusive-OR 運算;也就是說,只有在剛好有一個運算元為 true 時,結果才會是 true。 |
var1 = var2 ˆ var3; |
如果var2或var3其中一個(不能兩個都)是true時,var1為true,否則var1為false。 |
舉個簡單的例子:
以上code為 ─ 當myBool是true時,isTrue為true,否則isTrue為false。
條件式(布林)運算子:
接下來介紹長的很像 & 與 | 的兩個條件式(布林)運算子,如下表:
運算子 |
名稱 |
類型 |
說明 |
範例 |
結果 |
&& |
AND 條件運算子 |
Binary ( 二元運算子 ) |
AND 條件運算子 (&&) 會對其 bool 運算元執行 AND 邏輯運算,但只有在需要時才會評估第二個運算元。 |
var1 = var2 && var3; |
如果var2和var3都是true的時候,var1才會是true,否則是false。 |
|| |
OR 條件運算子 |
Binary ( 二元運算子 ) |
OR 條件運算子 (||) 會對其 bool 運算元執行 OR 邏輯運算,但只有在需要時才會評估第二個運算元。 | var1 = var2 || var3; |
如果var2或是var3其中一個(或兩個都)是true,var1為true,var2跟var3兩個都是false的時候,var1則為false。 |
看到以上表格內範例的結果,應該會覺得...看起來&運算子跟&&運算子不是一樣嗎? 而 | 運算子與 || 運算子看起來也差不多阿? 在說明那編寫出一個很重要的差別,就是這兩個運算子,
只有在需要時才會評估第二個運算元。
像&&的範例中,var1 = var2 && var3; 在判斷第一個運算元var2是false以後,就會直接傳false的結果回去給var1,不會再去判斷第二個運算元var3是true還是false(因為var2跟var3已經不可能都為true了),而用&的話,則是一定會去評估第二個運算元是true還是false,。
使用 || 運算子的時候也是,var1 = var2 || var3; 在判斷第一個運算元var2是true以後,就會直接傳true的結果回去給var1,不會再去判斷第二個運算元var3是true還是false(因為var2跟var3已經不可能都為false了),而用 | 的話,則是一定會去評估第二個運算元是true還是false。
這也就是所謂的「最少運算」(Short-Circuit) 評估,所以在寫程式的時候,常常使用&& 與 || 來代替 & 與 |。
(布林)指派運算子:
我們也可以使用(布林)指派運算子來做比較,就像是第十三篇的指派運算子那樣(+=、*= ...等等)。
運算子 |
名稱 |
類型 |
說明 |
範例 |
結果 |
& = |
AND 指派運算子 |
Binary ( 二元運算子 ) |
一元 & 運算子會傳回運算元的位址 (需要 unsafe 的內容)。 二元 & 運算子已為整數類資料型別及 bool 預先定義其運算方式。對於整數類資料型別,& 會針對其運算元進行邏輯位元 AND 運算。對於 bool 運算元,& 會針對其運算元進行邏輯 AND 運算,也就是說,只有在兩個運算元皆為 true 時,結果才會是 true。 & 運算子會同時評估兩個運算子,不管第一個運算子其值為何。 |
var1 &= var2; | 就像 var1 = var1 & var2 ,與使用&不同的地方在於當使用&= 時,var1只會被評估一次。 |
| = |
OR 指派運算子 |
Binary ( 二元運算子 ) |
已為整數類資料型別和 bool 預先定義二元 | 運算子。對於整數類資料型別,| 會針對其運算元進行位元 OR 運算。對於 bool 運算元,| 會針對其運算元進行邏輯 OR 運算,也就是說,唯有在兩個運算元皆為 false 時,結果才會是 false。 | var1 |= var2; | 就像 var1 = var1 | var2 ,與使用&不同的地方在於當使用|= 時,var1只會被評估一次。 |
ˆ = |
XOR 指派運算子 |
Binary ( 二元運算子 ) |
已為整數類資料型別和 bool 預先定義二元 ^ 運算子。對於整數型別,^ 會針對其運算元進行位元 (Bitwise) 互斥-OR 運算。對於 bool 運算元,^ 會針對其運算元進行邏輯 Exclusive-OR 運算;也就是說,只有在剛好有一個運算元為 true 時,結果才會是 true。 | var1 ˆ = var2; | 就像 var1 = var1 ^ var2 ,與使用&不同的地方在於當使用^= 時,var1只會被評估一次。 |
這篇介紹了很多運算子(為了這篇小弟也做了不少功課... 汗.. ),請各位初心者朋友們慢慢消化,在閱讀時如果覺得有疑慮的部分,歡迎留言給小弟一起討論喔! 下一篇將會利用這次介紹到的運算子,來做一個練習,如果這些簡單的邏輯概念我們都能融會貫通的話,我想我們也差不多可以升級了吧 ~ XD
--------------------------------- 分隔線 ---------------------------------
同場加映:布林值的由來
喬治·布爾(George Boole,1815年11月-1864年)
愛爾蘭的數學家、哲學家。喬治·布爾是一個皮匠的兒子,生於英格蘭的林肯。由於家境貧寒,布爾不得不在協助養家的同時,為自己能受教育而奮鬥,不管怎麼說,他成了19世紀最重要的數學家之一。他曾經考慮過以牧師為業,但最終還是決定投身於教育,而且不久就開辦了自己的學校。在準備課程的時候,布爾不滿意當時的數學課本,於是決定閱讀其它偉大數學家的論文。在閱讀偉大的法國數學家拉格朗日的論文時,布爾有了變分法方面的新發現。變分法是數學分析的分支,它處理的是尋求優化某些參數的曲線和曲面。
1848年,布爾出版了《The Mathematical Analysis of Logic》,這是他對符號邏輯諸多貢獻中的第一次。
1849年。他被任命位於愛爾蘭科克的皇后學院的數學教授(現考克愛爾蘭國立大學或UCC)。
1854年,他出版了《The Laws of Thought》,這是他最著名的著作。在這本書中布爾介紹了現在以他的名字命名的布爾代數。布爾撰寫了微分方程和差分方程的課本,這些課本在英國一直使用到19世紀末。
1855年,他與皇后校園的一位希臘文教授的侄女結婚。
1864年,布爾死於肺炎,肺炎是他在暴風雨天氣中儘管已經濕淋淋的了仍堅持上課引起的。由於在符號邏輯運算中的特殊貢獻,很多計算機語言中將邏輯運算稱為布爾運算,將其結果稱為布爾值(布林值)。
希望資深的前輩們與跟我一樣剛開始想學習C#的初心者,可以給我一些建議跟鼓勵,或是幫我在FB按個讚! 感謝您們 ~
(本文中相關內容有參閱、引述MSDN,wikipedia)
如果這篇文章對您有幫助,請幫我點選「我要推薦」、按個讚、或是幫我推到其他平台;您的鼓勵將會是我繼續努力的一大動力!!
若是有任何指教或是需要討論之處,也不用客氣,請在下面留言給我,我將會儘速回覆~