[C陷阱和缺陷] 1-詞法“陷阱”、2-語法“陷阱”
阿新 • • 發佈:2018-11-12
有感自己的C語言在有些地方存在誤區,所以重新仔細把"C陷阱和缺陷"翻出來看看,並寫下這篇部落格,用於讀書總結以及日後方便自身複習。
第1章 詞法“陷阱”
1.1 =不同與==
= 是賦值操作符,而 == 是作為比較操作符,初學者容易將 == 錯寫為 =,這種情況下編譯器不會報錯,這就有可能造成很嚴重的後果,還不容易發現。比如下面這個例子:
while( c=' ' || c=='\t' || c=='\n' ) { ; }
即使c既不等於'\t',也不等於'\n',但由於‘ ’賦給c,‘ ’不為0,所以while始終為真,成為死迴圈。所以有時採取下面這張寫法,就能儘可能地避免這種錯誤(個人不太喜歡),即使錯寫為 = ,編譯器也會報錯進行提醒:
while( ' '=c || '\t'==c || '\n'==c ) { ; }
1.2 詞法分析中的“貪心法”
當編譯器讀入一個字元‘/’後又跟了一個字元'*',那麼編譯器就必須做出判斷:是將其作為兩個獨立的符號對待,還是合併起來作為一個符號對待。C語言對這個問題的解決方案可以歸納為一個很簡單的規則:每一個符號應該包含儘可能多的字元。
也就是說,編譯器將程式分解成符號的方法是,從左到右一個字元一個字元地讀入,如果該字元可能組成一個符號,那麼再讀入下一個字元,判斷兩個讀入字符合併成的字串是否可能是一個字元的組成部分;如果可能,繼續讀入下一個字元,重複上述判斷,
直到讀入的字元組成的字串已不再可能組成一個有意義的符號。這個策略有時被稱為“貪心法”。
需要注意的是,除了字串和字元常量,符號的中間不能嵌有空白(空白、製表符、換行符)。例如,==是單個符號,== 是兩個符號,表示式 a---b 與 表示式 a -- - b的含義相同,與表示式a - --b的含義不同。
下面這個例子:
y = x/*p; //x除以p指向的內容
而實際上,/*被編譯器理解為一段註釋的開始,也就是說,該語句會將 x 之間賦給y,後面全是註釋。必須這麼寫才對:
y = x / *p; //正確
或者更加清楚一點,使用括號:
y = x/(*p); //正確