電子工程網(wǎng)

標題: 單片機C語(yǔ)言易錯 [打印本頁(yè)]

作者: 檸檬之星    時(shí)間: 2016-8-18 15:40
標題: 單片機C語(yǔ)言易錯

單片機C語(yǔ)言易錯知識點(diǎn),記住它們會(huì )讓你事半功倍!

在進(jìn)行單片機開(kāi)發(fā)時(shí),經(jīng)常都會(huì )出現一些很不起眼的問(wèn)題,這些問(wèn)題其實(shí)都是很基礎的C語(yǔ)言知識點(diǎn),是一些小細節。

但是正是因為很基礎,又都是小細節,所以我們往往容易忽視它們。結果有時(shí)候我們會(huì )花很長(cháng)的時(shí)間糾結一個(gè)問(wèn)題,遲遲找不到問(wèn)題的所在。當發(fā)現原因竟然是這么的簡(jiǎn)單和不起眼時(shí),我想不單是我,大家都會(huì )感到痛不欲生。這些問(wèn)題要記錄下來(lái),時(shí)刻提醒自己!!


1、 !和 ~ 不一樣! 是邏輯非符號,~ 是位取反符號。對IO口某個(gè)引腳賦值時(shí)不要錯用 !如


2、<<和>>的優(yōu)先級低于+、-比如要實(shí)現c=x*2+1,沒(méi)有加括號會(huì )出錯


3、移位要防止溢出其實(shí)用移位代替乘除法是個(gè)不錯的方法,筆者很喜歡拿到一段代碼后用移位代替乘除法來(lái)進(jìn)行優(yōu)化。不過(guò)有時(shí)候卻會(huì )出現問(wèn)題,比如溢出問(wèn)題。當很明顯可能溢出的話(huà)我們是會(huì )注意的,比如但是有時(shí)候這個(gè)問(wèn)題是不明顯的,比如當移位出現在數組索引或函數參數時(shí),有段用液晶顯示字符的代碼如下
我們可以用左移運算來(lái)代替乘法進(jìn)行優(yōu)化,如
這本是一個(gè)好方法,但是事實(shí)上上面的代碼是錯的。當執行c<<4時(shí),因為沒(méi)有明顯的賦值過(guò)程,我們可能認為沒(méi)問(wèn)題,而事實(shí)上c的高位已經(jīng)丟失了,所以得到錯誤的結果。一個(gè)可行的做法是先進(jìn)行強制轉換,如

4、無(wú)符號數和有符號數混合運算都會(huì )被強制轉換為無(wú)符號數運算當一個(gè)有符號數和一個(gè)無(wú)符號數進(jìn)行算術(shù)運算時(shí),系統會(huì )自動(dòng)將有符號數強制轉換為無(wú)符號數再進(jìn)行運算(即使你使用有符號數強制類(lèi)型轉換),如下面兩種寫(xiě)法的運輸結果是一樣的


5、局部變量要初始化局部變量沒(méi)有初始化的話(huà),因為單片機每次為他分配的是同一個(gè)內存區域,當你在函數中是這么使用局部變量時(shí),就可能出問(wèn)題:如果第一次調用fun時(shí),a傳遞的值為0,那么flag = 0x01;執行if(flag&0x01)后面的代碼。以后再調用fun時(shí),即使a不為0,但flag依然使用之前的內存區域,所以其值一直為0x01,一直執行的是if后面的代碼,而不是else后面的。






歡迎光臨 電子工程網(wǎng) (http://selenalain.com/) Powered by Discuz! X3.4
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页