C陷阱與缺陷(小結2)
語法分析
(語句、宣告的語法細節)
1.理解函式宣告
任何C變數的宣告都由兩部分組成:型別以及一組類似表示式的宣告符
如:float (*h)(); 其中型別為float,宣告符為:(*h)()。整個宣告表示:h 為一個函式指標,h所指向函式的返回值為浮點型。
由一個給定型別的變數的宣告得到該型別的型別轉換符:將變數名和宣告部分末尾的分號去掉,再將剩餘的部分用一個括號整個“封裝”起來。
如:float (*h)(); (float (*)()),表示“指向返回值為浮點型的函式的指標”的型別轉換符。
若fp是一個函式指標,則(*fp)()表示呼叫fp所指向的函式。
2.運算優先順序
() [] -> . 高於 單目運算子 高於 算術運算子 高於 移位運算子 高於關係運算符 高於 按位操作 高於 邏輯操作符 高於條件運算子 高於 賦值運算子 高於 逗號
結合性:自右向左,其它為自左向右
記住:邏輯運算子低於任意一個關係運算符;移位運算子低於算術運算子高於關係運算符;在關係運算符中,==和!=的優先順序最低。
如:*p++,*與++都為單目運算子,即同一優先順序,此時主要考慮結合性—自右向左,所以翻譯為*(p++),即取指標p所指向的物件,然後將p遞增1;而(*p)++是取指標p所指向的物件,然後該物件遞增1。
3.注意作為語句結束標誌的分號
(1) 在if和while語句之後需要緊跟一條語句時,若多了一個分號,此時原來緊跟if或while語句之後的語句就是一條單獨的語句,與條件判斷部分沒有任何關係。當然,也要注意不能遺漏一個分號。
(2) 當一個宣告的結尾緊跟一個函式定義時,若宣告結尾的分號被省略,編譯器可能會把宣告的型別視作函式的返回值型別
4.Switch語句
不要遺漏各個case部分的break語句;若對某一個分支情況的處理只要稍作改動,剩餘部分就完全等同於另一個分支情況下的處理,則可以有意略去一個break語句(最好在略去break語句的地方加上如下註解:
/*此處沒有break語句*/,來提示程式閱讀者,此處是有意省去一個break語句)。
5.函式呼叫
在函式呼叫時,即使函式不帶引數,也應包括(空)引數列表。
6.懸掛else引發的問題
記住:else始終與同一對括號內最近的未匹配的if結合。