C陷阱與缺陷學習心得之 詞法缺陷

2021-06-16 20:10:16 字數 1237 閱讀 8674

在我們的程式中所謂的「符號」指的是程式的乙個基本組成單元,其作用相當於乙個句子中的單詞。符號就是程式中的乙個基本資訊單元。而編譯器的工作就是負責將程式分解為乙個乙個符號的部分,一般稱為「詞法分析器」。

在c語言中,符號之間的空白(包括空格符、製表符或換行符)將被忽略,因此語句

if (x > big) big = x;

可以分解為ifx

bigbig

x1、=不同於==

在我們寫程式的時候,經常將符號=寫為==,這是乙個非常隱蔽但又非常嚴重的錯誤,我們知道=是賦值運算子,而符號==是比較運算子。然而當程式設計師本意是作比較運算時,卻可能無意中誤寫成了複製運算子。

比如下面的例子:

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

c = getc (f);

由於程式設計師在比較字元' '和變數c時,誤將比較運算子==寫成了賦值運算子=。因為賦值運算子的優先順序要低於邏輯運算子 ||,因此實際上是將一下表示式的值賦給了c:

『 』 ||  c== '\t'  || c == '\n'

因為 『 』不等於零(『 』的ascii碼值為32),那麼無論變數c此前為何值,上述表示式的值得結果都是1,因此迴圈將一直進行下去直到整個檔案結束。

2. 詞法分析中的「貪心法」

c語言中既有單字元符號比如/、*、=等也有多字元運算子你如/*和==等,當多個運算子放在一起的時候,編譯器就必須做出判斷:是將其作為兩個分別的符號對待還是合起來對待。c語言對這個問題的解決方案可以歸納為乙個很簡單的規則:每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果該字元可能組成乙個字元,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個字元的組成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成乙個有意義的字元。

3.整形常量

如果乙個整形常量的第乙個字元是數字0,那麼該常量將被視作八進位制數。因此c語言中的10和010的含義截然不同。因此我們這裡需要注意的是有時候我們在上下文中為了格式對齊的需要,可能無意中將十進位制數寫成了八進位制數。例如:

010,「hello」,

123,「world」

4.字元與字串

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

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

C缺陷與陷阱 詞法陷阱

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

C陷阱與缺陷(一)詞法 陷阱

第一章 詞法 陷阱 1 不同於 1 while c c t c n 賦值運算子 的優先順序低於邏輯運算子 相當於 c t c n 賦給了c,條件永遠為真 2 if x y 應該寫成if x y 0 對變數進行賦值並檢查該變數的新值是否為0 2 和 不同於 和 按位運算子 和 邏輯運算子 和 3 詞法...

C 陷阱與缺陷 (一)詞法陷阱

碼字不易,對你有幫助點讚 關注支援一下作者 看更多乾貨,獲取第一時間更新 練習上傳至 0.不同於 當程式設計師本意是作比較運算時,卻可能無意中誤寫成了賦值運算。1.本意是檢查 x 與 y 是否相等 if x y break 實際上是將 y 的值賦值給了 x 然後再檢查該值是否為 0 2.本意是跳過檔...