先說結論,if語句中多加一對小括號即可。具體除錯過程如下:
我用的編譯器版本是mplab x ide v4.15,微控制器型號是pic16f1938;
想用6位數碼管實現時鐘功能,結果寫出來的**,片選順序有問題,而且時分秒累加及進製都有問題。
拿單步跟蹤了老半天,發現是if語句進不去。if語句如下:
unsigned char buffer[3] = ;
if(buffer[0]&0x0f < 0x09)
else
我是左看右看,上看下看,還請同事幫我看,都沒看出來什麼問題。首先為了確認,我還特意複習了一下c語言運算子的優先順序順序 —— & 運算的優先順序高於 < 運算。那實在沒轍了,於是,在disassembly視窗中(debuging時,在window—>debuging選項中可以開啟該視窗),看了一下這條if語句對應的彙編指令,如下圖,
可以看出來,if語句根本沒有對應的彙編指令。 那就只能嘗試了,於是我在 & 運算子兩側加上了括號,改正後的**如下:
unsigned char buffer[3] = ;
if((buffer[0]&0x0f) < 0x09)
else
再重新編譯,奇蹟般地,**正常執行了!再看一下修改過後的if語句對應的彙編指令,如下圖,
可以 看出來,彙編指令也正常了。於是,誤打誤撞,if語句不執行的問題被一對括號解決了。
那麼問題來了,在if(
(
buffer[0]&0x0f
)
< 0x09 )這條語句中,這對紅色的小括號到底有什麼用呢?
羽碧落」指點
!這個時候,就體現出「**」這種生物的重要性了。。。根據我**所講,在沒有加這對紅色的小括號之前,if語句最終會變成下邊這樣
if(
buffer[0]
< 0x09 )
也就是說,沒有括號的話 ,buffer[0]&0x0f這個 & 操作的結果就不會儲存,最後就變成了buffer[0]裡的資料與0x09作比較。
若要再深入了解,可以查一下「c語言中小括號的作用」,或「c語言中左值與右值」。
trycatch中return語句如何執行
測試 如下 1 package reviewtest 23 4 classname returntest 5 description 測試return在trycatch中的執行6 author kingram 7 date 2018年7月27日8 9 10public class returntes...
C語言 if語句
案例 輸入任意三個整數num1 num2 num3,求三個數中的最大值。案例 輸入任意三個整數num1 num2 num3,求三個數中的最大值。功能 說明if 語句的格式。main 程式運 況如下 please input three numbers 11,22,18 the three numbe...
C語言 for語句
案例 求1 100的累計和。案例 求1 100的累計和。程式功能 求1 100的累計和 main 程式運 況如下 sum 5050 案例 求n的階乘n n 12 n 程式功能 求n!main 程式運 況如下 input n 5 5 120在3條迴圈語句中,for語句最為靈活,不僅可用於迴圈次數已經確...