c語言中分為單字元符號如 /、*、和 =,還有多字元符號如 /* 和 == 。
當c編譯器讀入乙個字元 '/' 後跟又跟了乙個字元 』*『,那麼編譯器就必須做出判斷:是將其作為兩個分別的符號對待,還是合起來作為乙個符號對待。
c語言對這個問題的解決方案可以歸納為乙個簡單的規則:每乙個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右乙個字元乙個字元讀入,如果該字元可能組成乙個符號,那麼再讀入下乙個字元,判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成部分;如果可能,繼續讀入下乙個字元,重複上述判斷,直到讀入的字元組成的字串已不再可能組成乙個有意義的符號。這個處理策略有時被稱為「貪心法」或者"大嘴法」。
需要注意:除了字串與字元常量,符號的中間不能嵌有空白(空格符、製表符和換行符)。
表示式
a--b
與表示式
a -- - b
的含義相同而與
a - -- b
的含義不同。
下面的語句的本意似乎是用x除以p所指向的值,把所得的商再賦給y:
y = x/*p;
而實際上,"/*" 被編譯器理解為一段注釋的開始,編譯器將不斷地讀入字元,直到"*/"出現為止。
也就是說,該語句直接將x的值賦給y,根本不會顧及到後面出現的p。將上面的語句重寫如下:
y = x / *p; // p指向除數
或者更加清楚一點,寫作:
y= x/(*p);
這樣得到的實際效果才是語句注釋所表示的原意。
練習 a+++++b的含義是什麼?
上式唯一有意義的解析方式是 a ++ + ++ b
可是根據「貪心法」 規則,上式可被分解為:
a ++ ++ + b
這個式子從語法上來說是不正確的,它等價於:
((a++)++) + b
但是,a++結果是右值,不能繼續進行++操作。所以會出現編譯錯誤。
關於++i++ 編譯錯誤?參考:c++ 操作符優先順序在++i++中,由於兩個原因:
一編譯器貪心法,那麼劃分成字首++和字尾++。
二是操作符的優先順序,字尾++的優先順序大於字首++
那麼++i++的結果就是:++(i++),由於i++返回值為右值,所以無法進行字首++操作,編譯錯誤。
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.本意是跳過檔...