今天更新一篇小短文,希望對(duì)你有幫助。
int func(int temp){return!!temp;}
不知道你是否看過(guò)上面類似的代碼,兩個(gè)感嘆號(hào)出現(xiàn)在代碼中,難道代碼也有思想,也需要表達(dá)情感嗎?
剛學(xué)習(xí) C語(yǔ)言的時(shí)候,你應(yīng)該經(jīng)常看到過(guò) 1 個(gè)感嘆號(hào)的情況,比如:
if(one!=two){.......}-----------------------------------------if(!temp){......}-----------------------------------typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;-----------------------------------------one=!temp;
但兩個(gè)感嘆號(hào)估計(jì)就很難見到了。
魚鷹大學(xué)四年、工作三年都沒(méi)見過(guò)這種寫法,直到前段時(shí)間看 Linux 源碼,才接觸到,第一次看到時(shí)非常驚訝,怎么還有這種寫法?
為什么要用兩個(gè)感嘆號(hào),作用是什么,只是為了表現(xiàn) C 語(yǔ)言的奇技淫巧嗎?
仔細(xì)想過(guò)后才驚嘆其中的巧妙。
假設(shè)一個(gè)字節(jié)變量 byte,可代表范圍 0~255,0 代表其中一種含義,1 ~255 代表另一種含義(你可能會(huì)問(wèn),怎么不直接用 0 和 1 表示,因?yàn)檫@個(gè)變量本身不只有 0 和 1,只是在另一個(gè)使用的地方才會(huì)只使用二值含義,總之會(huì)有這種情況)。
如果我要用另一個(gè)變量 bit 來(lái)表示這兩種含義,一般情況我們會(huì)這么做:
int func(unsigned char byte){ unsigned char bit; if(byte==0){bit=0;}else{ bit = 1;}return bit;}
更優(yōu)雅簡(jiǎn)單一點(diǎn)是這樣寫:
int func(unsigned char byte){bit=byte?1:0; return bit;}
但不管哪一個(gè),都不如第一個(gè)簡(jiǎn)單高效。
簡(jiǎn)單可以很容易看出來(lái),高效何在?
它不需要判斷語(yǔ)句(判斷語(yǔ)句在單片機(jī)中可能影響不是很大,但在有多級(jí)緩存的情況下,影響可能很大,這就是為什么 linux 中用 likely() 之類的進(jìn)行優(yōu)化)。
這樣,不管原先的byte 是什么值,都將變成 0 或1。
這樣一來(lái),如果調(diào)用者使用如下方式:
if(func() == 1){}或者 if(func()){ }
都不會(huì)出現(xiàn)問(wèn)題。
對(duì)于負(fù)數(shù)也是如此,只要是為了把 0 單獨(dú)分開,都可以采用這種方式。
這在底層開發(fā)中也非常實(shí)用。
比如 GPIO 有個(gè)引腳號(hào)需要判斷是 0 或 1,一般這樣:
bit=(GPIOB->IDR&GPIO_Pin_4) >> 4;
或者bit=(GPIOB->IDR&GPIO_Pin_4)? 1 : 0;
上一種確實(shí)也是不錯(cuò)的選擇,但是這里需要修改兩個(gè)地方,修改時(shí)很容易遺忘,所以不如下面這種簡(jiǎn)單:
bit=!!(GPIOB->IDR&GPIO_Pin_4);
如果換個(gè) IO ,需要修改代碼時(shí),只要修改一次就搞定,相當(dāng)方便,所以建議大家使用上面那種方式獲取位的值。
而從匯編的角度來(lái)看,兩次 ! 也只需要一條指令搞定:
效率不輸移位方式!
本文轉(zhuǎn)載自魚鷹談單片機(jī)
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209329 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136692 -
源碼
+關(guān)注
關(guān)注
8文章
639瀏覽量
29185 -
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68524
原文標(biāo)題:7 年了,沒(méi)見過(guò)代碼中出現(xiàn)過(guò)兩個(gè)感嘆號(hào)
文章出處:【微信號(hào):玩點(diǎn)嵌入式,微信公眾號(hào):玩點(diǎn)嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論