天天看點

6. 簡單又複雜的“運算符”,建議你看一哈

哈喽,我又來了~

昨天的《5. 很“迷”的字元與字元串》初稿本來很短的,但是我覺得内容太少了,就加了一些,結果好像就變得特别多〒▽〒。

内容提要:本文将主要介紹算術運算符、關系運算符和邏輯運算符這三種運算符。具體内容包括運算優先級比較,短徑求值,還有一條便于記憶的終極結論哦~今天推送的第三篇文章附加了C語言優先級速查表。

文章正文約2500字,閱讀約15分鐘。

1

算術運算符

算術運算符就是做加減乘除運算的運算符,常見的運算符有如下這些

6. 簡單又複雜的“運算符”,建議你看一哈

其中有三點需要注意

整數間的除法采用的是取整的方式,而不是四舍五入的方式,如 5/3 = 1

浮點數間的除法則能獲得一個相對逼近結果的值,如5.0/3.0 = 1.666667

求餘運算符要求 % 兩邊的操作數都要是整數,其結果也是整數。

1.1

什麼是 “目”

上面的表格中有雙目運算符,也有單目運算符,那什麼是 “目” 呢?如下圖所示

6. 簡單又複雜的“運算符”,建議你看一哈

其中加号是運算符,被運算符作用的運算對象稱之為操作數,比如 1 + 2,那麼 1 和 2 就是被加法運算符(+)作用的兩個操作數。是以運算符是雙目的還是單目的,要看其操作數的個數。很明顯,在算術運算符中除了正負号運算符,剩下的都是雙目運算符。

1.2

運算符的表達式及優先級

用運算符和括号将操作數連接配接起來的式子,我們稱之為表達式。比如1+2,'a'+'b',1+2+-1-9%5。

對于較為複雜的表達式我們需要考慮運算符的優先級和結合性,大部分的運算符和我們的認識一緻,比如先乘除後加減,有括号的先算括号内的。但是也會有一些較為特殊的運算符需要我們注意下計算的順序,在今天文章的第三條我們給出一個參考,可以快速檢視運算符号的優先級。順便在這裡我也安利下我常用的方法,很簡單!就是遇到不确定的優先級直接用括号把想優先計算的括起來~

1.3

運算中的類型轉換

當一個運算符的幾個操作數類型不同時(如 1 + 1.5),編譯器需要将它們轉換為共同的某種資料類型,才能進行運算。通常情況下,編譯器會将占記憶體比較小的操作數,先轉換為與占記憶體較大的操作數的相同類型,然後再進行運算。這樣做的目的就是為了確定計算的精确度。

此外C 語言還允許你強制轉換操作數的資料類型,具體的是在操作數的前邊用小括号将目标資料類型括起來,如int(1.6)。

1.4

舉例說明

第一個程式是關于運算優先級的示例

6. 簡單又複雜的“運算符”,建議你看一哈

實驗結果為i=3j=7和k=17

其中需要注意的是 -1 中的負号優先級很高,在 C 語言中排在第二優先級,而我們常用的乘除排在第三優先級,加減排在第四優先級。

第二個程式是關于類型轉換的示例

6. 簡單又複雜的“運算符”,建議你看一哈

實驗結果如下圖所示

6. 簡單又複雜的“運算符”,建議你看一哈

從輸出的第一行可以看到,整數的取整是對它的絕對值取整再加上符号,-2.5 會取整為 -2,而 2.5 會取整為 2。

gcc 對第二個printf中的内容進行了警告,大概意思是說我們将一個double類型的變量以 int 型進行列印輸出,可以看到輸出的結果明顯是不對的。

如果想輸出 1 + 2.8 的整型形式的結果,可以先通過(int) 2.8強制将其轉變為整型再進行相加,也可以将相加的結果直接強制轉變為整型。

2

關系運算符

如下圖所示,可以使用關系運算符來比較兩個數的大小關系

6. 簡單又複雜的“運算符”,建議你看一哈

其中同一個大括号中的關系運算符的優先級相同,上面的優先級要高于下面的優先級。用關系運算符将兩邊的變量、資料或表達式連接配接起來,稱之為關系表達式,如下所示列印出每一個關系表達式的值

6. 簡單又複雜的“運算符”,建議你看一哈

執行程式将會列印輸出 1 1 0 0 1 0

當關系表達式成立的時候會傳回數字 1 ,不成立的時會傳回數字 0 。其中整型的變量和整型的常量之間進行關系運算是很好了解的,但是字元型變量是如何進行比較的呢?很簡單通過字元型變量所對應的 ASCII 碼。

但是倒數第二個中的字元串是如何比較大小的呢?你可以先思考一下,在下面我們會給出答案~<( ̄︶ ̄)>~

3

邏輯運算符

C語言總共提供了三種邏輯運算符,如下圖所示

6. 簡單又複雜的“運算符”,建議你看一哈

首先要注意它們之間的優先級,因為邏輯非是一種單目運算符,而剩下的兩種是雙目運算符,是以邏輯非的優先級最高。用邏輯運算符将兩邊的變量、資料或表達式連接配接起來,稱之為邏輯表達式,如下為列印出每一個關系表達式的值

6. 簡單又複雜的“運算符”,建議你看一哈

通過之前文章我們知道關系運算符的優先級要高于邏輯運算符,是以第一個 printf 中的内容顯然為真;在第二個printf中||左側的是3+1 ,實際上在 C 語言中任意非零數字都可以算作是真,是以該語句名明顯應該輸出 1 ;剩下的幾個例子很好了解可以自行推導一下。

執行上面的代碼結果為 1 1 0 0 1

3.1

短路求值

短路求值又稱最小化求值,是一種邏輯運算符的求值政策。隻有當第一個運算數的值無法确定邏輯運算的結果時,才對第二個運算數進行求值。C語言對于邏輯與和邏輯或采用短路求值的方式。

比如說在 3>1 && 1<2 隻根據前半部分是沒有辦法判斷該表達式的取值的,是以還有根據後面的運算數求值;但是對于 3 == 1 && 1 < 2 來講,根據第一個運算數字就可以判斷該邏輯表達式為假,是以後面的比較運算就不會發生。

字元串的比較方法就是遵從了這個原則。符串比較就是從兩個字元串第一個位置開始比較對應位置上的字元的ASCII碼值,直到分出大小或者達到某個字元串的結尾,先到達結尾的字元串小。例如: “AC”<“B” 因為A的ASCII碼值比B小,那麼後面的就不在比較了 “ACA”<“ACAX” 前面三個"ACA"都相同,最後一個前面的字元串已到末尾,是以小。

又比如下面這個例子

6. 簡單又複雜的“運算符”,建議你看一哈

它的運作結果為

6. 簡單又複雜的“運算符”,建議你看一哈

這是因為執行到 a=0 的時候已經可以得到 (a=0) && (b=5); 是以後面的 b= 5 就不會被執行是以輸出 a = 0, b = 3;下面的同樣當執行到 a = 1 就已經的到了 (a = 1) || (b = 5) 的值,是以仍然不會執行 b = 5 ,列印輸出 a = 1, b = 3 。是以在采用邏輯運算表達式的時候一定要考慮清楚在邏輯運算符的左右應該分别放什麼。

4

終極結論!

如果你覺得上面的内容太多很難記?沒關系,呆博同學給出了一個便于記憶的終極結論!

! > 算術運算符 > 關系運算符 > && > || > 指派運算符

好了~今天的内容就到這裡了。還是老樣子哦,如果喜歡就點贊轉發支援一下,如果覺得哪裡不好,果斷留言批評就是啦~

參考

[1]“小甲魚” 視訊課程《帶你學C帶你飛》【第一季】P9 P10

[2] 百度知道 《C語言中比較字元串大小的判斷标準是什麼?》

原文釋出時間為:2018-10-12

本文作者:獨孤呆博

本文來自雲栖社群合作夥伴“

輪子工廠

”,了解相關資訊可以關注“

”。

繼續閱讀