《c陷阱與缺陷》第一章
while(c=' '
||c=='\t'
||c=='\n')
c=getc(f);
此例項本意是遍歷檔案並且跳過空和一些換行符,製表符。但是由於第乙個==寫成了=則此程式變成了。將『 』||c=='\t'||c=='\n'表示式的值賦給了c,並判斷c的值。由於c恆等於1則這會讀取到檔案最後。
如果真的想要實現在判斷中使用=的情況應該寫成:
if((x=y)!=0)
這樣寫就比較清楚意圖了。
1.2,&和|不同於&&和||
這個具有基本語法的人都知道,&和|為二進位制運算子,&&和||為邏輯判斷運算子。
1.3,詞法分析中的貪心法。
c語言中分析詞法一般都是往多了分析。
如果/的後面跟著那第乙個/並不會分析為除法。而是和組成/*用來注釋語句。
本書幾個代表性的例子為
(1)
a---b //a-- -b
(2)
y=x/*p // y=x (/*)p
(老版編譯器由於支援=+代表+=則會出現a=-1解釋為a =- 1即a=a-1而並不是a=(-1))
所以為了避免有可能發現這種情況還是加括號吧。
1.4,整型常量
在整型數前使用0開頭的是八進位制表示方法。
x=010;實際上x為8;
1.5,字元和字串
用單引號包起來的乙個字元實際上代表乙個整數,整數值對應該字元在編譯器中採用的字符集中的序列值。
因此'a'的含義與97嚴格一致
用雙引號包起來的字串,代表的是乙個指向無名陣列起始字元的指標。自動使用『/0』當做結尾。
hello=」hello\n「與hello=一致
整數型(16位或32位)一般可以容納多個字元(8位)數值按編譯器組合得到。
本書幾個代表性的例子為
char *str='\n' 錯誤因為使用單引號包起來實際是個整數,不能賦給字元指標。
printf('\n') 以前版本的編譯器可能不會報錯,因為不會檢查函式引數型別,現在的編譯器會出現不可知的錯誤。
練習1-1:
#include
using
namespace
std;
intmain
()
如果支援巢狀。則ans可以分解為 //0// 1;則輸出為1
如果不支援巢狀。則ans可以分解為/// 0 * // 1則01則輸出為0
練習1-2:
我會允許巢狀注釋。
練習1-3:
由貪心來說
a+++++b可以分解為 a ++ ++ + b則報語法錯誤。因為a++的結果為左
C陷阱與缺陷第一章 詞法「陷阱」
1.不同於 為賦值運算,為比較 2.和 不同於 和 按位運算子 邏輯運算子 3.詞法分析中的 貪心法 c語言的某些符號,例如 只有乙個字元長,還有其他符號,例如 有多個字元。編譯器1將程式分解成符號的方法是,從左到右乙個字元乙個字元地讀入,如果判斷已經讀入的兩個字元組成的字串是否可能是乙個符號的組成...
C陷阱與缺陷 第一章 詞法陷阱
符號 token 指程式的乙個基本組成單元,其作用相當於乙個句子中的單詞,是程式的乙個基本的資訊單元。組成符號的字串行就不相同,同一組字串行在某個上下文環境中屬於乙個符號,而在另乙個上下文環境中可能屬於完全不同的另乙個符號。編譯器中負責將程式分解為乙個乙個符號的部分,一般稱為 詞法分析器 c語言中,...
C語言陷阱與缺陷 第一章學習
編譯器中負責將程式分解的乙個乙個的符號的部分,一般都為 詞法分析器 例子 if x big big x 這個我們自己理解起來也很好理解,就是如果x big的時候把x的資料賦值給big,這個很簡單的東西在一些演算法中會用到,比如快速查詢演算法當中。include includeint main 與a ...