1. 程式人生 > >C陷阱與缺陷(小結2)

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結合。