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

第4章 運算符
視頻講解:1小時39分鐘)

表達式在C#程序中應用廣泛,尤其是在計算功能中,往往需要大量的表達式。而大多數表達式都使用運算符,運算符結合一個或一個以上的操作數,便形成了表達式,并且返回運算結果。本章將對C#中的表達式與運算符進行詳細講解。

通過學習本章,讀者主要掌握以下內容:

熟悉算術運算符的使用

掌握賦值運算符

掌握如何使用關系運算符

掌握邏輯運算符的使用方法

掌握如何對變量進行位操作

熟悉運算符的優先級順序

4.1 運算符分類

視頻講解

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

4.1.1 算術運算符

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

表4.1 算術運算符

圖4.1 3門課的成績

【例4.01】某學員3門課成績如圖4.1所示,編程實現:

  •  C#課和SQL課的分數之差。
  •  3門課的平均分。

代碼如下:(實例位置:資源包\源碼\04\4.01)

程序運行結果如圖4.2所示。

圖4.2 計算學生成績的分差及平均分

注意

使用除法(/)運算符和求余運算符時,除數不能為0,否則將會出現異常。

4.1.2 自增、自減運算符

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

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

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

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

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

注意

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

多學兩招

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

4.1.3 賦值運算符

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

1. 簡單賦值運算符

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

2. 復合賦值運算符

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

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

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

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

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

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

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

(1)低精度類型自增

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

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

(2)不規則的多值運算

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

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

說明

在C#中可以把賦值運算符連在一起使用。例如:

在這個語句中,變量x,y,z都得到同樣的值5,但在程序開發中不建議使用這種賦值語法。

4.1.4 關系運算符

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

表4.3 關系運算符

說明

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

【例4.02】創建一個控制臺應用程序,聲明3個int類型的變量,并分別對它們進行初始化,然后分別使用C#中的各種關系運算符對它們的大小關系進行比較,代碼如下:(實例位置:資源包\源碼\04\4.02)

程序運行結果如圖4.4所示。

圖4.4 使用關系運算符比較大小關系

4.1.5 邏輯運算符

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

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

表4.4 邏輯運算符

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

表4.5 使用邏輯運算符進行邏輯運算

技巧

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

【例4.03】創建一個控制臺應用程序,使用代碼實現4.1.5節開始描述的場景—參加面包店的打折活動,代碼如下:(實例位置:資源包\源碼\04\4.03)

程序運行結果如圖4.5和圖4.6所示。

圖4.5 符合條件的運行效果

圖4.6 不符合條件的運行效果

4.1.6 位運算符

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

說明

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

1. “位與”運算

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

2. “位或”運算

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

圖4.7 12&8的運算過程

圖4.8 4|8的運算過程

3. “位異或”運算

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

4. “取反”運算

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

圖4.9 31^22的運算過程

圖4.10 ~123的運算過程

4.1.7 移位運算符

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

1. 左移位運算符<<

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

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

圖4.11 左移位運算

2. 右移位運算符>>

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

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

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

圖4.12 正數的右移位運算過程

圖4.13 負數的右移位運算過程

多學兩招

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

4.1.8 條件運算符

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

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

技巧

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

關于if語句的詳細講解,請參見第5章。

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

等價于:

【例4.04】創建一個控制臺應用程序,使用條件運算符判斷輸入年齡所處的階段,并輸出相應的提示信息,代碼如下:(實例位置:資源包\源碼\04\4.04)

程序運行結果如圖4.14所示。

圖4.14 使用條件運算符判斷人的年齡階段

4.2 運算符優先級與結合性

視頻講解

C#中的表達式是使用運算符連接起來的符合C#規范的式子,運算符的優先級決定了表達式中運算執行的先后順序。運算符優先級其實相當于進銷存的業務流程,如進貨、入庫、銷售、出庫,只能按這個步驟進行操作。運算符的優先級也是這樣的,它是按照一定的先后順序進行計算的,C#中的運算符優先級由高到低的順序依次是:

(1)單目運算符。

(2)算術運算符。

(3)移位運算符。

(4)關系運算符。

(5)邏輯運算符。

(6)條件運算符。

(7)賦值運算符。

如果兩個運算符具有相同的優先級,則會根據其結合性確定是從左至右運算,還是從右至左運算。表4.6列出了運算符從高到低的優先級順序及結合性。

表4.6 運算符的優先級順序及結合性

說明

表4.6中的“←”表示從右至左,“→”表示從左至右,從表4.6中可以看出,C#中的運算符中,只有單目、條件和賦值運算符的結合性為從右至左,其他運算符的結合性都是從左至右,所以,下面的代碼是等效的:

4.3 小結

本章主要的內容是運算符,幾種常用的運算符需要讀者重點掌握。在應用程序開發中,運算符被頻繁地使用,可見其重要性。最常見的運算符有算術運算符、自增自減運算符、賦值運算符、關系運算符、邏輯運算符、位運算符以及其他一些特殊的運算符。如果表達式中需要同時存在幾個運算符,那么就必須考慮運算符的優先級順序,優先級順序高的要比優先級順序低的先被執行。

4.4 實戰

4.4.1 實戰一:誰家是“超生游擊隊”

國家推出二胎政策,A家庭陸續生了2個孩子,B家庭陸續生了4個孩子,哪個家庭屬于超生家庭?實戰效果如圖4.15所示。(實例位置:資源包\源碼\04\實戰\01)

圖4.15 誰家是“超生游擊隊”

4.4.2 實戰二:模擬用戶登錄

使用邏輯運算符判斷用戶輸入的用戶名和密碼是否同時滿足條件,如果是,輸出“登錄成功”,否則,輸出“登錄失敗”。提示:默認的用戶名和密碼分別是mr和mrsoft,另外,該程序實現時需要用到關系運算符“==”和條件運算符“?:”。登錄成功和失敗的效果分別如圖4.16和圖4.17所示。(實例位置:資源包\源碼\04\實戰\02)

圖4.16 登錄成功

圖4.17 登錄失敗

主站蜘蛛池模板: 汉寿县| 淮南市| 航空| 年辖:市辖区| 湖北省| 鲁甸县| 高碑店市| 肇源县| 永胜县| 长沙市| 凤阳县| 台湾省| 泊头市| 桐乡市| 武清区| 刚察县| 黄龙县| 梁山县| 邢台县| 西平县| 运城市| 修武县| 鸡泽县| 芜湖县| 蓝田县| 衡山县| 吕梁市| 丹江口市| 湛江市| 宁城县| 尉氏县| 宁远县| 贵港市| 昌黎县| 文成县| 武穴市| 聊城市| 桂阳县| 丹江口市| 桂东县| 天门市|