轉(zhuǎn)自:mp.weixin.qq.com/s/YmNcEX9S41K21POsE552iA
【嵌牛導(dǎo)讀】:在進(jìn)行單片機(jī)開發(fā)時(shí),經(jīng)常都會(huì)出現(xiàn)一些很不起眼的問題箕昭,這些問題其實(shí)都是很基礎(chǔ)的c語言知識(shí)點(diǎn)落竹,是一些小細(xì)節(jié)旭愧。但是正是因?yàn)楹芑A(chǔ)去扣,又都是小細(xì)節(jié)怪与,所以我們往往容易忽視它們。結(jié)果有時(shí)候我們會(huì)花很長(zhǎng)的時(shí)間糾結(jié)一個(gè)問題,遲遲找不到問題的所在遍愿。當(dāng)發(fā)現(xiàn)原因竟然是這么的簡(jiǎn)單和不起眼時(shí)存淫,我想大家都會(huì)感到痛不欲生。筆者今天又碰到了這樣的問題错览,實(shí)在忍不住了纫雁。因?yàn)檫@些問題都是小的知識(shí)點(diǎn)煌往,考慮到之前也遇到好多這種問題倾哺,于是決定每次遇到問題就記錄下來,時(shí)刻提醒自己!!
【嵌牛鼻子】:?jiǎn)栴}總結(jié)刽脖、c語言編程
【嵌牛提問】:在進(jìn)行單片機(jī)開發(fā)時(shí)羞海,我們會(huì)遇到許多編程上的問題,這些問題會(huì)耗費(fèi)我們大量時(shí)間曲管,如此以往却邓,我們?cè)撊绾我?guī)避呢?
【嵌牛正文】:
1. !和~不一樣
! :邏輯非符號(hào)院水;
~:是位取反符號(hào)腊徙;
對(duì)IO口某個(gè)管腳賦值時(shí)不要錯(cuò)用 !民傻,如
1. <<和>>的優(yōu)先級(jí)低于+、-
比如要實(shí)現(xiàn)c=x*2+1喧半,沒有加括號(hào)會(huì)出錯(cuò)
3. 移位要防止溢出
其實(shí)用移位代替乘除法是個(gè)不錯(cuò)的方法吴菠,筆者很喜歡拿到一段代碼后用移位代替乘除法來進(jìn)行優(yōu)化。不過有時(shí)候卻會(huì)出現(xiàn)問題榨乎,比如溢出問題。當(dāng)很明顯可能溢出的話我們是會(huì)注意的,比如
但是有時(shí)候這個(gè)問題是不明顯的,比如當(dāng)移位出現(xiàn)在數(shù)組索引或函數(shù)參數(shù)時(shí)缀蹄,有段用液晶顯示字符的代碼如下
我們可以用左移運(yùn)算來代替乘法進(jìn)行優(yōu)化悬襟,如
這本是一個(gè)好方法逸绎,但是事實(shí)上上面的代碼是錯(cuò)的巫糙。當(dāng)執(zhí)行c<<4時(shí)乏悄,因?yàn)闆]有明顯的賦值過程,我們可能認(rèn)為沒問題卵惦,而事實(shí)上c的高位已經(jīng)丟失了,所以得到錯(cuò)誤的結(jié)果哨坪。一個(gè)可行的做法是先進(jìn)行強(qiáng)制轉(zhuǎn)換忿偷,如
4. 無符號(hào)和有符號(hào)運(yùn)算
當(dāng)一個(gè)有符號(hào)數(shù)和一個(gè)無符號(hào)數(shù)進(jìn)行算術(shù)運(yùn)算時(shí)渠概,系統(tǒng)會(huì)自動(dòng)將有符號(hào)數(shù)強(qiáng)制轉(zhuǎn)換為無符號(hào)數(shù)再進(jìn)行運(yùn)算(即使你使用有符號(hào)數(shù)強(qiáng)制類型轉(zhuǎn)換)猪狈,如下面兩種寫法的運(yùn)輸結(jié)果是一樣的。
5. 局部變量要初始化
這一點(diǎn)是比較容易被忽略的。局部變量沒有初始化的話,因?yàn)閱纹瑱C(jī)每次為他分配的是同一個(gè)內(nèi)存區(qū)域,當(dāng)你在函數(shù)中是這么使用局部變量時(shí)择膝,就可能出問題:
如果第一次調(diào)用fun時(shí)饺律,a傳遞的值為0,那么flag = 0x01;
執(zhí)行if(flag&0x01)后面的代碼十籍。以后再調(diào)用fun時(shí)勾栗,即使a不為0楷拳,但flag依然使用之前的內(nèi)存區(qū)域,所以其值一直為0x01臭脓,一直執(zhí)行的是if后面的代碼砚作,而不是else后面的领猾。