查看: 2918|回復: 0
打印 上一主題 下一主題

單片機C語(yǔ)言易錯

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2016-8-18 15:40:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)鍵詞: 嵌入式 , 單片機 , C語(yǔ)言 , Linux

單片機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后面的。

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页