C陷阱和缺陷 第1章 詞法「陷阱」

2022-02-20 18:13:43 字數 1838 閱讀 1336

有感自己的c語言在有些地方存在誤區,所以重新仔細把《c陷阱和缺陷》一書翻出來看看,並寫下這篇部落格,用於讀書總結以及日後方便自身複習。

=是賦值操作符,而==是作為比較操作符,初學者容易將==錯寫為=,這種情況下編譯器不會報錯,這就有可能造成很嚴重的後果,還不容易發現。比如下面這個例子:

while( c=' ' || c=='\t' || c=='\n' )
while( ' '=c || '\t'==c || '\n'==c )

當編譯器讀入乙個字元'/'後又跟了乙個字元'*',那麼編譯器就必須做出判斷:是將其作為兩個獨立的符號對待,還是合併起來作為乙個符號對待。c語言對這個問題的解決方案可以歸納為乙個很簡單的規則:每乙個符號應該包含盡可能多的字元。

也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷兩個讀入字元合併成的字串是否可能是乙個字元的組成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成乙個有意義的符號。這個策略有時被稱為「貪心法」。

需要注意的是,除了字串和字元常量,符號的中間不能嵌有空白(空白、製表符、換行符)。例如,==是單個符號,= =是兩個符號,表示式a---b與 表示式a -- - b的含義相同,與表示式a - --b的含義不同。看下面這個例子:

y = x/*p; // x除以p指向的內容
而實際上,/*被編譯器理解為一段注釋的開始,也就是說,該語句會將x之間賦給y,後面全是注釋。必須這麼寫才對:

y = x / *p; // 正確
或者更加清楚一點,使用括號:

y = x/(*p); //正確

如果乙個整型變數的第乙個字元是數字0,那麼該常量將被視為八進位制數。因此,10010的含義完全不同。例如,0195的含義是1*8^2 + 9*8^1 + 5*8^0,也就是141(十進位制)或者0215(八進位制)。

需要注意這種情況,有時候在上下文中為了格式對齊的需要,可能無意間將十進位制數寫成了八進位制數,例如:

struct

porttab[ ] =

c語言中的單引號和雙引號含義完全不同,用單引號引起的乙個字元實際上表示乙個整數,例如'a'的含義與97(十進位制)嚴格一致。而即使是用雙引號引起的乙個字元,也是指向乙個無名陣列首個字元的指標,該陣列被雙引號之間的字元以及字元'\0'初始化。

下面的這個語句:

printf("hello world\n");

char hello[ ] = ;
是等效的。

因為用單引號引起的乙個字元代表乙個整數,而用雙引號引起的乙個字元代表乙個指標,所以兩者不能混用,否則編譯器的型別檢查功能將會檢查到錯誤:

char *p = 'a'; // error!

《C陷阱與缺陷》 第0章導讀 第1章詞法陷阱

1.與 的區別 賦值運算子 的優先順序要小於邏輯運算子 也就是說,會進行先邏輯上的比較,然後再把比較結果進行賦值,很合理.getc庫是什麼?1.c語言中有單字元 也有多字元單元如 c語言對這一問題的解決方案為 每個符號應該包含盡可能多的字元.即貪心法的處理策略 所以例如 a b 與a b 相同 與a...

C缺陷與陷阱 詞法陷阱

從較低的層面考察,程式是由符號 token 序列組成的,將程式分解成符號的過程,稱為詞法分析。這節主要分析在程式被詞法分析器分解成各個符號的過程中可能出現的問題。編譯器中負責將程式分解成乙個乙個符號的部分,一般稱之為詞法分析器。c語言中符號之間的空白 包括空格符,製表符和換行符 將被忽略。術語符號 ...

C陷阱與缺陷 讀書筆記 1 詞法「陷阱」

c陷阱與缺陷 是由andrew koenig所著,高巍譯。andrew koenig是at t大規模程式研發部 前貝爾實驗室 成員,不僅有著多年的c 開發,研究和教學經驗,而且還親身參與了c 的演化和變革,對c 的變化和發展起到重要的影響。第一章 詞法陷阱 編譯器中負責將程式分解為乙個乙個符號的部分...