- 零基礎學C++程序設計
- 劉媛媛編著
- 5119字
- 2022-05-06 12:28:16
3.3 常用運算符
在數據處理中,除最基礎的賦值運算符外還有很多常用的運算符,包括算術運算符、自增自減運算符、位運算符等,下面將詳細進行講解。
3.3.1 算術運算符
算術運算符包括四則運算加、減、乘、除運算符(+、-、*、/)和取模運算符(%)。加、減、乘、除運算符與數學中的四則運算符相同,在使用除法運算符時,除數(第2個操作數)不能為0。取模運算符的兩個操作數必須為整數類型。
算術運算符是雙目運算符,也就是需要擁有兩個操作數。其操作數一般是整數和浮點數。C++語言中支持的算術運算符如表3.1所示。
表3.1 算術運算符

提示:在算術運算符中也會遵循隱式類型轉換規則,如果兩個操作數都是整數,則運算的結果也是整數;如果兩個操作數類型不同,則自動轉換為尺寸較大的數據類型進行計算。
【示例3-6】使用算術運算符運算數據。

程序運行結果如下。

在C++中,算術運算符也有優先級和結合性規則。算術運算符的結合性都是從左到右的;算術運算符的優先級如圖3.8所示。

圖3.8 算術運算符的優先級
【示例3-7】下面使用算術運算符運算數據。

程序運行結果如下。

在此代碼中使用了多個算術運算符,首先會進行除法運算,其次進行取模運算,然后進行加法運算、減法運算,最后再進行加法運算。
3.3.2 正負運算符
生活所接觸到數據會有正負之分。同樣,C語言使用正負運算符用于數字的正負運算。正負運算符包含兩個符號“+”與“-”。
1.正運算符
正運算符(+)屬于單目運算符,擁有一個操作數。該運算符一般用于格式上的對齊,并不能讓負數變為正數。其語法形式如下。

【示例3-8】下面驗證使用正運算符無法改變數的值。

程序運行結果如下。

可以看出代碼中的正運算符并沒有改變變量a的值。
2.負運算符
負運算符(-)屬于單目運算符,擁有一個操作數,可以讓數字進行負運算。其語法形式如下。

【示例3-9】下面演示負運算符改變值的正負。

程序運行結果如下。

從代碼中可以看出,負運算符將變量a的值進行了正負改變。
3.3.3 復合賦值運算符

圖3.9 變量名相同
在進行算術運算時,如果賦值運算符左右兩側的變量名相同,如圖3.9所示,就可以使用復合賦值運算符來簡化代碼。
在C++語言中,為了提高運算效率和簡化書寫,提供了復合賦值運算符,又稱擴展賦值運算符。該類型運算符如表3.2所示。
表3.2 復合賦值運算符

【示例3-10】下面使用加法賦值運算符求和。

程序運行結果如下。

從運行結果中可以看出,a=a+10與a=+10的效果是相同的。
3.3.4 自增自減運算符
在生活中我們常常會做一些簡單的計數運算。例如,在App中簽到贏取積分,每次簽到積分都會增加1。對于這種累加或累減運算使用加法運算符編寫程序是沒有必要的,因此在C++語言中提供了專門的增量運算符與減量運算符,也就是自增運算符和自減運算符。
1.自增運算符
自增運算符(++)屬于單目運算符,擁有一個操作數,操作數必須是變量,適用于整數和小數類型。該運算符可以讓變量進行自加運算。根據運算符使用的位置,該運算符有兩種語法形式。
(1)前綴自增運算符會讓操作數自增1后,再參與其他運算,其語法形式如下。

【示例3-11】下面演示前綴自增運算符的使用。

程序運行結果如下。

在代碼std::cout 〈〈 "i的值為" 〈〈 ++i〈〈 std::endl;中,首先i變量會先進行自增,然后才會參與輸出,所以輸出結果為7,如圖3.10所示。

圖3.10 分步展示(1)
代碼std::cout 〈〈 "i的值為" 〈〈 i 〈〈 std::endl;再次輸出i的值,i仍然為7。
(2)后綴自增運算符會讓操作數參與運算后,操作數的值再自增1,其語法形式如下。

【示例3-12】下面演示后綴自增運算符的使用。


程序運行結果如下。

在代碼std::cout 〈〈 "i的值為" 〈〈 i++ 〈〈 std::endl;中,首先會輸出變量i的值,然后變量i進行自增運算,如圖3.11所示。

圖3.11 分步展示(2)
所以,std::cout 〈〈 "i的值為" 〈〈 i++ 〈〈 std::endl;輸出結果為6,std::cout 〈〈 "i的值為" 〈〈i 〈〈 std::endl;輸出的結果為7。
2.自減運算符
自減運算符(--)屬于單目運算符,擁有一個操作數,操作數必須是變量,適用于整數和小數類型。該運算符可以讓變量進行自減運算。根據運算符使用的位置,該運算符有兩種語法形式。
(1)前綴自減運算符會讓操作數自減1后,再參與其他運算,其語法形式如下。

【示例3-13】下面演示前綴自減運算符的使用。

程序運行結果如下。

在代碼中首先變量i會先進行自減,然后才會參與輸出,所以兩次輸出結果都為5。
(2)后綴自減運算符會讓操作數參與其他運算后,操作數的值再自減1,其語法形式如下。

【示例3-14】下面演示后綴自減運算符的使用。


程序運行結果如下。

在代碼中首先變量i會被輸出,然后才會進行自減運算,所以第一次輸出為6,第二次輸出為5。
3.自增自減運算符使用建議
由于自增自減運算符會涉及多個加號或者減號的使用,所以在一個表達式中要盡量避免多次出現同一類運算。
【示例3-15】下面演示多個自增運算符的使用。

程序運行結果如下。

代碼i=i+++i++;中就多次使用了自增運算符,并與加法運算符混合使用。這種寫法導致代碼可讀性極低,而且在不同編譯器中運行結果會出現不同。
3.3.5 位運算符
計算機的運算基礎是二進制數的運算。在內存中,數據都以二進制形式進行存儲。C++語言也提供二進制數值相關的運算符,它們統稱為位運算符。位是其中的最小單位,1 字節(byte)由8位(bit)組成。每1位即1bit,8bit=1byte,即1字節,在C++提供了多種位運算符,如表3.3所示。
表3.3 位運算符

位運算符優先級如圖3.12所示。在位運算中除按位取反運算符~為右結合外,其他幾個位運算符都為左結合。

圖3.12 位運算符優先級
1.位邏輯運算符
位的邏輯運算簡單來說就是將指定的兩個位中的二進制數據進行比較,如果相同,運算結果為1;如果不同,運算結果就為0。二進制數運算涉及的位邏輯運算符包括按位取反運算符、按位與運算符、按位或運算符、按位異或運算符四種,如表3.4所示。
表3.4 位邏輯運算符

1)按位取反運算符
按位取反運算符(~)屬于單目運算符,擁有一個操作數,其語法形式如下。

按位取反運算符可以將數值轉換為二進制數后按位取反,即0變為1,1變為0。
【示例3-16】下面將1進行取反運算并輸出。

程序運行結果如下。

代碼中十進制數1的二進制數為00000001,取反運算后為二進制數11111110,即十進制數-2,取反過程如圖3.13所示。

圖3.13 1取反運算
2)按位與運算符
按位與運算符(&)屬于雙目運算符,擁有兩個操作數,其語法形式如下。

按位與運算符可以將數值轉換為二進制數后按位進行與運算。其運算規則是按位比較,都為1時為1,都為0時為0,一個為1一個為0時則為0,如圖3.14所示。

圖3.14 按位與運算
【示例3-17】下面演示按位與運算,并輸出結果。

程序運行結果如下。

代碼中十進制數1的二進制數為01,十進制數2的二進制數為10,按位進行與運算,二進制結果為00即十進制數0,如圖3.15所示。

圖3.15 1&2運算過程
3)按位或運算符
按位或運算符(|)屬于雙目運算符,擁有兩個操作數,其語法形式如下。

按位或運算符可以將數值轉換為二進制數后按位進行或運算。其運算規則是按位比較,都為0時為0,都為1時為1,一個為1一個為0時則為1,如圖3.16所示。

圖3.16 按位或運算
【示例3-18】下面演示按位或運算,并輸出運算結果。

程序運行結果如下。

代碼中十進制數1的二進制數為01,十進制數2的二進制數為10,按位進行或運算,二進制結果為11即十進制數3,如圖3.17所示。

圖3.17 1|2運算過程
4)按位異或運算符
按位異或運算符(^)屬于雙目運算符,擁有兩個操作數,其語法形式如下。

按位異或運算符可以將數值轉換為二進制數后按位進行異或運算。其運算規則是按位比較,兩個值相同時,運算結果為0;兩個值不同時,運算結果為1,如圖3.18所示。

圖3.18 按位異或運算
【示例3-19】下面演示按位異或運算,并輸出運算結果。

程序運行結果如下。

代碼中十進制數2的二進制數為10,十進制數3的二進制數為11,按位進行異或運算,二進制結果為01即十進制數1,如圖3.19所示。

圖3.19 2^3運算過程
2.移位運算符
移位運算就是將二進制數據向右或向左移動,如果有空位用0補齊的運算,這樣會讓數值產生變化。C++語言中的移位運算符包括左移運算符與右移運算符兩種,如表3.5所示。
表3.5 移位運算符

1)左移運算符
左移運算符(〈〈)屬于雙目運算符,擁有兩個操作數。操作數1表示要左移的數,操作數2表示要左移的位數。這里的位是指二進制的數值位,1位即1bit,8位為1字節,其語法形式如下。

左移運算符可以將數值轉換為二進制數后按位進行左移運算。其運算規則是將二進制數向左移動,右側移動空下的位置用0補全。例如,表達式11100100〈〈4表示將11100100左移4位,結果為01000000。
【示例3-20】下面演示左移運算,并輸出運算結果。

程序運行結果如下。

代碼中十進制整數1的二進制數為00000001,左移4位后為00010000,轉換為十進制整數為24也就是16,如圖3.20所示。

圖3.20 1〈〈4運算過程
2)右移運算符
右移運算符(〉〉)屬于雙目運算符,擁有兩個操作數,操作數1表示要右移的值,操作數2表示要右移的位數。這里的位是指二進制的數值位,其語法形式如下。

右移運算符可以將數值轉換為二進制數后按位進行右移運算。其運算規則是將二進制數向右移動,左側移動空下的位置用0補全。例如,表達式11100100〉〉4表示將11100100右移4位,結果為00001110。
【示例3-21】下面演示右移運算,并輸出運算結果。


程序運行結果如下。

代碼中十進制整數4的二進制數為00000100,右移4位后為00000000,轉換為十進制整數為0,如圖3.21所示。

圖3.21 4〉〉4運算過程
3.3.6 關系運算符
在生活中,我們常常會對兩個物體的大小、質量等屬性進行比較。在C++語言中,也需要對數據的大小進行比較,如按照年齡為公司員工進行排序。C++語言提供了六種關系運算符,如表3.6所示。
表3.6 關系運算符

關系運算符擁有兩個操作數,如下所示。

其運算規則是比較兩個操作數的關系是否和關系運算符的含義相同,如果相同,運算結果為1;如果不同,運算結果為0。例如,在表達式3〉2中,因為3確實大于2,與運算符大于號(〉)的含義相同,所以該表達式的運算結果為1。
例如,在表達式3〉5中,3并不大于5,與大于號的含義不同,所以表達式3〉5的運算結果為0。表達式5〉3中,5確實大于3,與大于號的含義相同,所以表達式5〉3的運算結果為1。
【示例3-22】輸出關系運算符的運算結果。

程序運行結果如下。

從運行結果中可以看出,每個關系運算符的結果除了1就是0,具體的值由兩個操作數的關系是否與當前關系運算符一致決定。
3.3.7 邏輯運算符
C++語言包括邏輯與、邏輯或和邏輯非三種邏輯運算符。邏輯運算符可以對指定的條件進行對錯判斷然后運算,接下來將進行詳細講解。
1.邏輯與運算
邏輯與運算符(&&)屬于雙目運算符,擁有兩個操作數,其語法形式如下。

其中操作數1與操作數2都屬于條件表達式,當兩個操作數都為真時,運算結果為1,表示真;否則,運算結果為0,表示假。
2.邏輯或運算
邏輯或運算符(||)屬于雙目運算符,擁有兩個操作數,其語法形式如下。

其中操作數1與操作數2都屬于條件表達式,當兩個操作數中至少有一個為真時,運算結果為1,表示真;如果兩個操作數都為假,則運算結果為0,表示假。
3.邏輯非運算
邏輯非運算符(!)屬于單目運算符,擁有一個操作數,其語法形式如下。

操作數屬于條件表達式,當操作數為真時,運算結果為0,表示假;當操作數為假時,運算結果為1,表示真。
邏輯運算符的判斷條件與運算結果如表3.7所示。
表3.7 邏輯運算符的判斷條件與運算結果

邏輯運算優先級如圖3.22所示。邏輯運算符!為右結合,運算符&&與運算符||為左結合。

圖3.22 邏輯運算優先級
【示例3-23】下面演示邏輯運算符的使用。

程序運行結果如下。

代碼運行過程如下。
? 在表達式1〉2 && 3〉2 中,1〉2的值為0,3〉2的值為1,因為有一個值為0,所以0&&1的值為0。
? 在表達式1〉2 ||3〉2 中,1〉2的值為0,3〉2的值為1,因為有一個1,所以0||1的值為1。
? 在表達式a = 1 〉 2與 a = !a中,1〉2的值為0,零取反就是1,所以!0的值為1。
3.3.8 逗號運算符
逗號運算符可以使多個表達式寫在一行上,從而大大地簡化了程序,語法形式如下。

在聲明變量的內容中我們就使用過逗號運算符,例如,可以將代碼

寫為

在后面將要講解的條件語句中也會使用大量的逗號運算符。
3.3.9 條件運算符
在生活中我們常常會遇到一些二選一的情況。例如,完成暑假作業的同學可以正常放學,沒有完成暑假作業的同學需要叫家長來接。這里面“是否完成暑假作業”就是一個條件,當達到條件后能正常放學,如果沒有達到條件則需要叫家長來接。
C++中的條件運算符(?: )就可以用于實現根據條件選擇運算結果的效果。條件運算符(?: )屬于三目運算符,有三個操作數。操作數1為條件,如果條件為真,則運算結果值為操作數2;如果條件為假,則運算結果值為操作數3。其語法形式如圖3.23所示。

圖3.23 條件運算符語法形式
【示例3-24】下面使用條件運算符進行運算。

程序運行結果如下。

從代碼中可以看出,10〉20的運算結果為假,也就是0,所以表達式10 〉 20 ? 10 : 20的運算結果為20。