自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

七年了,沒見過代碼中出現(xiàn)過兩個感嘆號

開發(fā) 前端
為什么要用兩個感嘆號,作用是什么,只是為了表現(xiàn) C 語言的奇技淫巧嗎?仔細(xì)想過后才驚嘆其中的巧妙。

有半個多月沒更新筆記了,廣告少,動力也明顯不足了,挺安逸的,畢竟最近魚鷹也有其它事情要忙,主業(yè)要緊。在此感謝大家的繼續(xù)關(guān)注!

今天繼續(xù)更新一篇小短文,希望對你有幫助。

  1. int func(int temp
  2.   return !!temp

不知道你是否看過上面類似的代碼,兩個感嘆號出現(xiàn)在代碼中,難道代碼也有思想,也需要表達(dá)情感嗎?

剛學(xué)習(xí) C語言的時候,你應(yīng)該經(jīng)??吹竭^ 1 個感嘆號的情況,比如:

  1. if(one != two) 
  2.   ....... 
  3. ----------------------------------------- 
  4. if(!temp
  5. ...... 
  6. ----------------------------------- 
  7. typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; 
  8. ----------------------------------------- 
  9. one = !temp

但兩個感嘆號估計就很難見到了。

魚鷹大學(xué)四年、工作三年都沒見過這種寫法,直到前段時間看 Linux 源碼,才接觸到,第一次看到時非常驚訝,怎么還有這種寫法?

為什么要用兩個感嘆號,作用是什么,只是為了表現(xiàn) C 語言的奇技淫巧嗎?

仔細(xì)想過后才驚嘆其中的巧妙。

假設(shè)一個字節(jié)變量 byte,可代表范圍 0~255,0 代表其中一種含義,1 ~255 代表另一種含義(你可能會問,怎么不直接用 0 和 1 表示,因為這個變量本身不只有 0 和 1,只是在另一個使用的地方才會只使用二值含義,總之會有這種情況)。

如果我要用另一個變量 bit 來表示這兩種含義,一般情況我們會這么做:

  1. int func(unsigned char byte) 
  2.   unsigned char bit
  3.    
  4.   if(byte == 0)  { 
  5.     bit = 0; 
  6.   } 
  7.   else
  8.     bit = 1; 
  9.   } 
  10.   return bit

更優(yōu)雅簡單一點是這樣寫:

  1. int func(unsigned char byte) 
  2.   bit = byte ? 1 : 0; 
  3.   return bit

但不管哪一個,都不如第一個簡單高效。

簡單可以很容易看出來,高效何在?

它不需要判斷語句(判斷語句在單片機中可能影響不是很大,但在有多級緩存的情況下,影響可能很大,這就是為什么 linux 中用 likely() 之類的進行優(yōu)化)。

這樣,不管原先的 byte 是什么值,都將變成 0 或 1。

這樣一來,如果調(diào)用者使用如下方式:

  1. if(func() == 1) 
  2.    
  3. 或者  
  4. if(func()) 
  5.    

都不會出現(xiàn)問題。

對于負(fù)數(shù)也是如此,只要是為了把 0 單獨分開,都可以采用這種方式。

這在底層開發(fā)中也非常實用。

比如 GPIO 有個引腳號需要判斷是 0 或 1,一般這樣:

  1. bit =  (GPIOB->IDR & GPIO_Pin_4) >> 4; 
  2.  
  3. 或者 
  4. bit = (GPIOB->IDR & GPIO_Pin_4) ? 1 : 0; 

上一種確實也是不錯的選擇,但是這里需要修改兩個地方,修改時很容易遺忘,所以不如下面這種簡單:

  1. bit = !!(GPIOB->IDR & GPIO_Pin_4); 

如果換個 IO ,需要修改代碼時,只要修改一次就搞定,相當(dāng)方便,所以建議大家使用上面那種方式獲取位的值。

而從匯編的角度來看,兩次 ! 也只需要一條指令搞定:

 

效率不輸移位方式!

 

責(zé)任編輯:武曉燕 來源: 魚鷹談單片機
相關(guān)推薦

2015-06-19 11:00:09

bash

2020-08-13 09:35:50

Linux命令軟件

2020-12-24 10:40:44

Linux命令文件

2022-04-26 09:01:45

運算符TypeScript代碼

2023-12-10 14:28:58

VS Code軟件開發(fā)代碼編輯器

2019-07-19 09:24:35

Java開發(fā)代碼

2016-06-22 10:18:59

聯(lián)想服務(wù)器

2021-12-19 13:41:46

WiFi電腦技術(shù)

2020-03-08 17:20:21

微信互聯(lián)網(wǎng)封鏈

2017-12-19 15:17:18

OpenStackEasyStack

2022-04-22 10:41:53

HTML標(biāo)簽功能

2022-09-26 19:20:07

CSS選擇器HTML

2022-02-16 09:54:43

AI模型

2022-07-29 12:04:04

GitHub開源神器

2012-07-18 09:43:40

FLash

2015-11-23 09:52:02

2010-05-25 16:57:50

Fedora 13Fedora

2023-07-28 07:43:55

2022-03-21 08:40:32

開源VsCode編輯器

2011-08-10 08:24:39

項目經(jīng)理
點贊
收藏

51CTO技術(shù)棧公眾號