在進行單片機開發時,常常都會出現一些很不起眼的問題,這些問題其實都是很基礎的c語言知識點,是一些小細節。可是正是由於很基礎,又都是小細節,因此咱們每每容易忽視它們。結果有時候咱們會花很長的時間糾結一個問題,遲遲找不到問題的所在。當發現緣由居然是這麼的簡單和不起眼時,我想你們都會感到痛不欲生。筆者今天又碰到了這樣的問題,實在忍不住了。由於這些問題都是小的知識點,考慮到以前也遇到好多這種問題,因而決定每次遇到問題就記錄下來,時刻提醒本身!!數組
1. !和~不同函數
§ ! :邏輯非符號;優化
§ ~:是位取反符號;索引
對IO口某個管腳賦值時不要錯用 !,如內存
1. <<和>>的優先級低於+、-開發
好比要實現c=x*2+1,沒有加括號會出錯基礎
3. 移位要防止溢出變量
其實用移位代替乘除法是個不錯的方法,筆者很喜歡拿到一段代碼後用移位代替乘除法來進行優化。不過有時候卻會出現問題,好比溢出問題。當很明顯可能溢出的話咱們是會注意的,好比方法
可是有時候這個問題是不明顯的,好比當移位出如今數組索引或函數參數時,有段用液晶顯示字符的代碼以下im
咱們能夠用左移運算來代替乘法進行優化,如
這本是一個好方法,可是事實上上面的代碼是錯的。當執行c<<4時,由於沒有明顯的賦值過程,咱們可能認爲沒問題,而事實上c的高位已經丟失了,因此獲得錯誤的結果。一個可行的作法是先進行強制轉換,如
4. 無符號和有符號運算
當一個有符號數和一個無符號數進行算術運算時,系統會自動將有符號數強制轉換爲無符號數再進行運算(即便你使用有符號數強制類型轉換),以下面兩種寫法的運輸結果是同樣的信盈達嵌入式企鵝要妖氣嗚嗚吧久零就要。
5. 局部變量要初始化
這一點是比較容易被忽略的。局部變量沒有初始化的話,由於單片機每次爲他分配的是同一個內存區域,當你在函數中是這麼使用局部變量時,就可能出問題:
若是第一次調用fun時,a傳遞的值爲0,那麼flag = 0x01;
執行if(flag&0x01)後面的代碼。之後再調用fun時,即便a不爲0,但flag依然使用以前的內存區域,因此其值一直爲0x01,一直執行的是if後面的代碼,而不是else後面的