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

3.5 運算符

運算符是具有運算功能的符號。根據使用運算符的個數,可以將運算符分為單目運算符、雙目運算符和三目運算符,其中:單目運算符是作用在一個操作數上的運算符,如正號(+)等;雙目運算符是作用在兩個操作數上的運算符,如加法(+)、乘法(*)等;三目運算符是作用在3 個操作數上的運算符,C# 中唯一的三目運算符就是條件運算符(?:)。本節將詳細講解C# 中的運算符。

3.5.1 算術運算符

img

C#中的算術運算符是雙目運算符,主要包括+、-、*、/和% 5種,它們分別用于進行加、減、乘、除和模(求余數)運算。C# 中的算術運算符的功能及使用方式如表3.5 所示。

表3.5 C# 中的算術運算符的功能及使用方式

img

示例5.計算學生成績的分數之差及平均分

某學員的3 門課的成績:C 語言為89 分、C# 為90 分、SQL 為60 分,編程實現如下計算。

(1)C# 課和SQL 課的分數之差。

(2)3 門課的平均分。

代碼如下。

img

計算學生成績的分數之差及平均分代碼的運行結果如圖3.15 所示。

img

圖3.15 計算學生成績的分數之差及平均分代碼的運行結果

學習筆記

在使用除法運算符和模運算符時,除數不能為0,否則將會出現異常,如圖3.16所示。

img

圖3.16 除數為0 時出現的異常

3.5.2 自增運算符和自減運算符

img

在使用算術運算符時,如果需要對數值型變量的值進行加1 或減1 操作,則可以使用下面的代碼。

img

針對以上功能,C# 中還提供了另外的實現方式:自增運算符、自減運算符,它們分別用++ 和-- 表示,下面分別對它們進行講解。

自增運算符和自減運算符是單目運算符,在使用時有兩種形式,分別是++expr、expr++,或者--expr、expr--。其中,++expr、--expr 是前置形式,它表示expr 自身先加1或減1,其運算結果是自身修改后的值,再參與其他運算。而expr++、expr-- 是后置形式,它也表示自身加1 或減1,但其運算結果是自身未修改的值。也就是說,expr++、expr--是先參加完其他運算,然后進行自身加1 或減1 操作。自增運算符和自減運算符放在不同位置時的運算示意圖如圖3.17 所示。

img

圖3.17 自增運算符和自減運算符放在不同位置時的運算示意圖

例如,下面代碼演示自增運算符放在變量的不同位置時的運算結果。

img

學習筆記

自增運算符、自減運算符只能作用于變量,因此,下面的形式是不合法的。

img

學習筆記

如果程序中不需要使用操作數原來的值,只是需要其自身進行加(減)1,那么建議使用前置自加(減),因為后置自加(減)必須先保存原來的值,而前置自加(減)不需要保存原來的值。

3.5.3 賦值運算符

img

賦值運算符主要用來為變量等賦值,它是雙目運算符。C# 中的賦值運算符分為簡單賦值運算符和復合賦值運算符,下面分別對其進行講解。

1.簡單賦值運算符

簡單賦值運算符以符號“=”表示,其功能是將右操作數所含的值賦給左操作數。例如:

img

2.復合賦值運算符

在程序中對某個對象進行某種操作后,如果要將操作結果重新賦值給該對象,則可以通過下面的代碼實現。

img

上面的代碼看起來很煩瑣,在C# 中,上面的代碼等價于:

img
img

上面代碼中的+= 就是一種復合賦值運算符。復合賦值運算符又稱為帶運算的賦值運算符,它其實是將賦值運算符與其他運算符合并成一個運算符來使用,從而同時實現兩種運算符的效果的。

C# 提供了很多復合賦值運算符,其說明及運算規則如表3.6 所示。

表3.6 復合賦值運算符的說明及運算規則

img

3.復合賦值運算符的優勢及劣勢

在使用復合賦值運算符時,雖然 “a += 1” 與 “a = a + 1” 兩者的運算結果是相同的,但是在不同的場景下,兩種使用方法都有各自的優勢和劣勢,下面分別對其進行介紹。

1)低精度類型自增

在C# 中,因為整數的默認類型為int 型,所以下面的代碼會報錯。

img

在上面的代碼中,在沒有進行強制類型轉換的條件下,a+1 的結果是一個int 型的值,無法直接賦給一個byte 型變量。但是如果使用“+=”實現遞增計算,就不會出現這種問題,代碼如下。

img

2)不規則的多值運算

復合賦值運算符雖然簡潔、強大,但是有些時候是不推薦使用的。例如,下面的代碼。

img

上面的代碼如果改用復合賦值運算符實現,就會顯得非常煩瑣,代碼如下。

img

學習筆記

在C# 中可以把賦值運算符連在一起使用。例如下面的代碼,在這段代碼中,變量x、y、z 都得到同樣的值5,但在程序開發中不建議使用這種賦值語法。

img

3.5.4 關系運算符

img

關系運算符是雙目運算符,它用于程序中的變量之間及其他類型的對象之間的比較,它返回一個代表運算結果的布爾值。當關系運算符對應的關系成立時,運算結果為true;否則為false。關系運算符通常用在條件語句中來作為判斷的依據。C# 中的關系運算符有6 個,其作用及說明如表3.7 所示。

表3.7 C# 中的關系運算符的作用及說明

img

學習筆記

不等于運算符(!=)是與等于運算符相反的運算符,它與!(a==b) 是等效的。

示例6.使用關系運算符比較大小關系

創建一個控制臺應用程序,聲明3 個int 類型的變量,并分別對它們進行初始化,然后分別使用C# 中的各種關系運算符對它們的大小關系進行比較,代碼如下。

img

學習筆記

第5 行代碼使用Console.WriteLine(); 輸出了一個空行,起到換行的作用。

第7 ~12 行代碼主要演示6 種關系運算符的使用方法。

使用關系運算符比較大小關系代碼的運行結果如圖3.18 所示。

img

圖3.18 使用關系運算符比較大小關系代碼的運行結果

3.5.5 邏輯運算符

img

假定某面包店在每周二的下午7 點至8 點和每周六的下午5 點至6 點對生日蛋糕商品進行折扣讓利活動,那么想參加折扣活動的顧客就要在時間上滿足這樣的條件:周二并且7:00 PM—8:00PM 或周六并且5:00 PM—6:00PM,這里就用到了邏輯關系,C# 中也提供了這樣的邏輯運算符來進行邏輯運算。

邏輯運算符是對真和假這兩種布爾值進行運算的,運算后的結果仍是一個布爾值。C#中的邏輯運算符主要包括&/&&(邏輯與)、|/||(邏輯或)、!(邏輯非)。在邏輯運算符中,除 “!” 是單目運算符外,其他都是雙目運算符。表3.8 列出了邏輯運算符的用法和說明。

表3.8 邏輯運算符的用法和說明

img

在使用邏輯運算符進行邏輯運算時,其運算結果如表3.9 所示。

表3.9 使用邏輯運算符進行邏輯運算時的運算結果

img

學習筆記

邏輯運算符 “&&” 與 “&” 都表示 “邏輯與”,那么它們之間的區別是什么呢?從表3.9 中可以看出,當兩個表達式都為true 時,邏輯與的結果才會為true。使用 “&” 會判斷兩個表達式;而 “&&” 則是針對bool 類型的數據進行判斷的,當第一個表達式為false 時,則不去判斷第二個表達式,直接輸出結果,從而節省計算機判斷的次數。通常將這種在邏輯表達式中根據左端的表達式可推斷出整個表達式的值稱為 “短路”,而那些始終執行邏輯運算符兩邊的表達式稱為“非短路”?!埃ΓΑ睂儆凇岸搪贰边\算符,而 “&” 則屬于 “非短路” 運算符?!皘|” 與 “|” 的區別跟 “&&” 與 “&” 的區別類似。

示例7.參加面包店的打折活動

創建一個控制臺應用程序,使用代碼實現本小節開始描述的場景,代碼如下。

img
img

學習筆記

第9 行和第13 行代碼使用了if…else 條件判斷語句,該語句主要用來判斷是否滿足某種條件。該語句將在第4章進行詳細講解,這里只需要了解即可。

第9 行代碼中在對條件進行判斷時,使用了邏輯運算符&&、|| 和關系運算符==、>=、<=。

運行參加面包店的打折活動代碼,符合條件的運行結果如圖3.19 所示,不符合條件的運行結果如圖3.20 所示。

img

圖3.19 符合條件的運行結果

img

圖3.20 不符合條件的運行結果

3.5.6 位運算符

img

位運算符的操作數類型是整型,可以是有符號的,也可以是無符號的。C# 中的位運算符有位與、位或、位異或、取反等運算符。其中,位與、位或、位異或為雙目運算符,取反為單目運算符。位運算是完全針對位方面的操作,因此,它在實際使用時,需要先將要執行運算的數據轉換為二進制,然后才能執行運算。

學習筆記

整型數據在內存中以二進制的形式表示,如整型變量7 的32 位二進制表示是00000000 00000000 00000000 00000111,其中,左邊最高位是符號位,最高位是0 表示正數;若為1,則表示負數。負數采用補碼表示,如-8 的32 位二進制表示為11111111 11111111 11111111 11111000。

1.位與運算

位與運算的運算符為 “&”。位與運算的運算法則是,如果兩個整型數據a、b 對應位都是1,則結果位才是1;否則為0。如果兩個操作數的精度不同,則結果的精度與精度高的操作數相同,如圖3.21 所示。

2.位或運算

位或運算的運算符為 “|”。位或運算的運算法則是,如果兩個操作數對應位都是0,則結果位才是0;否則為1。如果兩個操作數的精度不同,則結果的精度與精度高的操作數相同,如圖3.22 所示。

img

圖3.21 12&8 的運算過程

img

圖3.22 4|8 的運算過程

3.位異或運算

位異或運算的運算符是 “^”。位異或運算的運算法則是,當兩個操作數的二進制表示相同(同時為0 或同時為1)時,結果為0;否則為1。若兩個操作數的精度不同,則結果的精度與精度高的操作數相同,如圖3.23 所示。

4.取反運算

取反運算也稱為按位非運算,運算符為 “~”。取反運算就是將操作數對應二進制中的1 修改為0,將0 修改為1,如圖3.24 所示。

img

圖3.23 31^22 的運算過程

img

圖3.24 ~123 的運算過程

在C# 中使用Console.WriteLine 輸出圖3.21 ~圖3.24 的運算結果,主要代碼如下。

img

圖3.21 ~圖3.24 的運算結果如圖3.25 所示。

img

圖3.25 圖3.21 ~圖3.24 的運算結果

3.5.7 移位運算符

img

C# 中的移位運算符有兩個,分別是左移位運算符<< 和右移位運算符>>,這兩個運算符都是雙目運算符,它們主要用來對整數類型數據進行移位操作。移位運算符的右操作數不可以是負數,并且要小于左操作數的位數。下面分別對左移位運算符<< 和右移位運算符>> 進行講解。

1.左移位運算符<<

左移位運算符<< 是將一個二進制操作數向左移動指定的位數,左邊(高位端)溢出的位被丟棄,右邊(低位端)的空位用0 補充。左移位運算相當于乘以2 的n 次冪。

例如,int 類型數據48 對應的二進制數為00110000,將其左移1 位,根據左移位運算符的運算規則可以得出(00110000<<1)=01100000,所以轉換為十進制數就是96(48×2);將其左移2 位,根據左移位運算符的運算規則可以得出(00110000<<2)=11000000,所以轉換為十進制數就是192(48×22),其執行過程如圖3.26 所示。

img

圖3.26 左移位運算執行過程

2.右移位運算符>>

右移位運算符>> 是將一個二進制操作數向右移動指定的位數,右邊(低位端)溢出的位被丟棄,而在填充左邊(高位端)的空位時,如果最高位是0(正數),則左側空位填入0;如果最高位是1(負數),則左側空位填入1。右移位運算相當于除以2 的n 次冪。

正數48 右移1 位的運算過程如圖3.27 所示。

負數-80 右移2 位的運算過程如圖3.28 所示。

img

圖3.27 正數48 右移1 位的運算過程

img

圖3.28 負數-80 右移2 位的運算過程

學習筆記

由于移位運算的速度很快,在程序中遇到表達式乘以(或除以)2 的n 次冪的情況時,一般采用移位運算來代替。

3.5.8 條件運算符

img

條件運算符用 “?:” 表示,它是C# 中唯一的三目運算符,該運算符需要3 個操作數,形式如下。

img

在條件運算符的表達形式中,表達式1 是一個布爾值,可以為真或假。如果表達式1為真,則返回表達式2 的運算結果;如果表達式1 為假,則返回表達式3 的運算結果。例如:

img

學習筆記

條件運算符相當于一個if 語句,因此,上面的第2 行代碼可以修改如下。

img

關于if 語句的詳細講解,請參看本書第4章。

另外,條件運算符的結合性是從右向左的,即從右向左運算。例如:

img

等價于:

img

示例8.使用條件運算符判斷人的年齡所處階段

創建一個控制臺應用程序,使用條件運算符判斷輸入年齡所處的階段,并輸出相應的

提示信息,代碼如下。

img

學習筆記

在第4 行代碼中,Int32.Parse 方法用來將用戶輸入的年齡轉換為int 類型,存儲到int 類型變量中。

第6 行代碼定義了一個string 類型的變量,記錄條件表達式的返回結果。

使用條件運算符判斷人的年齡所處階段代碼的運行結果如圖3.29 所示。

img

圖3.29 使用條件運算符判斷人的年齡所處階段代碼的運行結果

主站蜘蛛池模板: 新建县| 个旧市| 夏河县| 华阴市| 房山区| 灵寿县| 武强县| 康保县| 民勤县| 潼关县| 鹤峰县| 盐亭县| 泉州市| 盱眙县| 朝阳县| 托克托县| 深泽县| 富阳市| 冀州市| 凤山市| 渝中区| 栖霞市| 永清县| 武宣县| 彰化市| 安岳县| 望奎县| 安顺市| 长春市| 远安县| 志丹县| 陵川县| 勐海县| 增城市| 嘉禾县| 渭南市| 荔浦县| 射洪县| 黄大仙区| 阳谷县| 江安县|