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

2021-07-04 07:48:42 字數 1751 閱讀 7998

《c陷阱與缺陷》是由andrew koenig所著,高巍譯。andrew koenig是at&t大規模程式研發部(前貝爾實驗室)成員,不僅有著多年的c++開發,研究和教學經驗,而且還親身參與了c++的演化和變革,對c++的變化和發展起到重要的影響。

第一章    詞法陷阱

編譯器中負責將程式分解為乙個乙個符號的部分,一般稱為「語法分析器」。

1.1    = 不同於 ==

while (c='' || c==' ' || c==' ')

c=getc(f);

這個迴圈將一直進行到檔案的結束,是否死迴圈取決於getc的實現。

如果確實需要在條件判斷部分使用賦值,應該顯式地進行比較:

if ((x=y) != 0)

foo();

1.2    & 和 | 不同於 && 和 ||

1.3    語法分析中的「貪心法」

c語言對這個問題的解決方案可以歸納為乙個很簡單的規則:每乙個符號應該包含盡可能多的字元。

編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個符號,再接著讀下個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,知道讀入的字元組成的字串已不再可能組成乙個有意義的符號。這種處理策略有時被稱為「貪心法」,或者更口語化一點,稱為「大嘴法」。

a---b 與 a --  - b 的含義相同,而與  a -   -- b 的含義不同。

1.4    整型常量

如果乙個整型常量的第乙個字元是數字0,那麼該常量將被視作八進位制數。

1.5    字元與字串

c語言中的單引號和雙引號含義迥異,在某些情況下如果把兩者弄混,編譯器並不會檢測報錯,從而在執行是產生難以預料的結果。

用單引號引起的乙個字元實際上代表乙個整數,整數值對應於該字元在編譯器採用的字符集中的序列值。

用雙引號引起的字串,代表的卻是乙個指向無名數字起始字元的指標,該陣列被雙引號之間的字元以及乙個額外的二進位制為零的字元 '\0' 初始化。

然而,某些c編譯器對函式引數並不進行型別檢查,特別是對printf函式的引數。因此, 如果用

printf(' ');       

來代替正確的

printf(" ");

則會在程式執行的時候產生難以預料的錯誤,而不會給出編譯器診斷資訊。

整型數(一般為16位或32為)的儲存空間可以容納多個字元(一般為8位),因此有個c編譯器允許在乙個字元常量(以及字串常量)中包括多個字元。也就是說,用'yes'代替"yes"不會被該編譯器檢測到。後者的含義是「一次包括'y''e''s'以及空字元''的4個連續記憶體單元的首位址「。前者的含義並沒有準確的進行定義,但大多數編譯器理解為,「乙個整數值,由'y''e''s'所代表的整數值按照特定編譯器實現中定義的方式組合得到「。

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

第一章 一 知識點 1 術語 符號 token 指的是程式的乙個基本組成單元。p15 2 除了字串與字元常量,符號的中間不能嵌有空白 空格符 製表符 換行符 例如 下面的表示式 a b與表示式a b的含義相同,而與a b的含義不同。p19 3 在c語言中,用單引號引起的乙個字元實際上代表乙個整數,整...

C缺陷與陷阱 詞法陷阱

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

《C缺陷與陷阱》讀書筆記

一 為什麼很多程式設計規範上要求單字元符號兩邊用空格隔開呢?如 a 2 最好不要寫成 a 2 在 c陷阱與缺陷 中詞法陷阱部分講到 如y x p,原本想表達的意思是p指標指向除數,但實際編譯過程中,編譯器會將 理解為一段注釋的開始,編譯器將不斷地讀入字元,直到 出現為止 這一錯誤也在 c專家程式設計...