成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

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

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

但兩個(gè)感嘆號(hào)估計(jì)就很難見到了。

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

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

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

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

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

  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)雅簡單一點(diǎn)是這樣寫:

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

但不管哪一個(gè),都不如第一個(gè)簡單高效。

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

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

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

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

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

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

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

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

比如 GPIO 有個(gè)引腳號(hào)需要判斷是 0 或 1,一般這樣:

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

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

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

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

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

 

效率不輸移位方式!

 

責(zé)任編輯:武曉燕 來源: 魚鷹談單片機(jī)
相關(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

運(yùn)算符TypeScript代碼

2019-07-19 09:24:35

Java開發(fā)代碼

2023-12-10 14:28:58

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

2016-06-22 10:18:59

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

2021-12-19 13:41:46

WiFi電腦技術(shù)

2017-12-19 15:17:18

OpenStackEasyStack

2020-03-08 17:20:21

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

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

2011-08-10 08:24:39

項(xiàng)目經(jīng)理

2015-11-23 09:52:02

2022-03-21 08:40:32

開源VsCode編輯器

2010-05-25 16:57:50

Fedora 13Fedora

2023-07-28 07:43:55

點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产激情第一页 | av激情在线 | 国产sm主人调教女m视频 | 中文字幕国产高清 | 91久久精品一区二区二区 | 国产精品自产av一区二区三区 | 成人福利在线 | 黄色大片在线免费观看 | 国产在线区| 欧美精| 免费在线a视频 | 亚洲一区二区三区四区视频 | 日韩在线观看中文字幕 | 中文在线日韩 | 免费一级网站 | 亚洲精品一二区 | 久久久av | jav成人av免费播放 | 中文字幕精品一区二区三区在线 | 超碰97人人人人人蜜桃 | 韩日一区二区三区 | 狠狠干美女| 中文字幕一区二区三区精彩视频 | 欧美一区成人 | 久久成人精品视频 | 国产一区二区视频免费在线观看 | 国产精品1区 | 亚洲精品电影在线观看 | 日本在线网站 | 欧美三级电影在线播放 | 在线播放一区二区三区 | 国产在线一区二区三区 | 精品一区二区电影 | 成人免费视频在线观看 | 激情六月天 | 天天影视网天天综合色在线播放 | 久久久久久久久一区 | 不卡的av电影| 免费一看一级毛片 | 亚洲午夜一区二区 | 毛片免费在线观看 |