第一二三四五六章
第一章
C語言是一種
- 底層語言
- 小型語言
- 包容性語言
優(yōu)點(diǎn):
- 高效
- 可移植
- 功能強(qiáng)大
- 靈活
- 標(biāo)準(zhǔn)庫
- 與UNIX系統(tǒng)的集成
缺點(diǎn):
- C程序更容易隱藏錯(cuò)誤
- C程序可能會(huì)難以理解
- C程序可能會(huì)難以修改
高效的使用C語言
- 學(xué)習(xí)如何規(guī)避C語言的缺陷:《C陷阱與缺陷》
- 使用軟件工具使程序更可靠:lint诗祸,splint
- 利用現(xiàn)有的代碼庫
- 采用一套切合實(shí)際的編碼規(guī)范
- 避免“投機(jī)取巧”和極度復(fù)雜的代碼
- 緊貼標(biāo)準(zhǔn)
第二章
- 指令:預(yù)處理器執(zhí)行的命令
- 函數(shù):一系列組合在一起并且賦予了名字的語句
- 語句:程序運(yùn)行時(shí)執(zhí)行的命令
- 聲明:變量使用前必須對(duì)其進(jìn)行聲明。
- C99:聲明可以不在語句之前
- 賦值:變量通過賦值的方式獲得值
- C通用原則:在任何需要數(shù)值的地方,都可以使用具有相同類型的表達(dá)式
- 標(biāo)識(shí)符受限的情況:
- 關(guān)鍵字
- 某些編譯器吧特定的標(biāo)識(shí)符(如asm)視為附加關(guān)鍵字
- 以下劃線開頭
- C89指出以下劃線后跟一個(gè)大寫字母開頭的名字是保留字雷猪,程序員不應(yīng)使用
- 根據(jù)C標(biāo)準(zhǔn)站玄,編譯器必須用一個(gè)空格字符替換每條注釋語句
- 標(biāo)識(shí)符長度:
- C89標(biāo)準(zhǔn)聲稱標(biāo)識(shí)符可以任意長笨腥,但只要求編譯器記住前31個(gè)字符(C99中是63個(gè))
- 對(duì)于具有外部鏈接的標(biāo)識(shí)符帐萎,C89中只有前6個(gè)字符才是有效的表悬,并且不區(qū)分大小寫校读;C99中沼侣,前31個(gè)字符有效,且字母區(qū)分大小寫
- 大多數(shù)編譯器和鏈接器都比標(biāo)準(zhǔn)要求的寬松
- Horner法則
第三章
-
scanf
函數(shù)-
工作方式:
- 從左邊開始處理字符串中的信息歉秫,對(duì)于格式串中的每一個(gè)轉(zhuǎn)換說明蛾洛,
scanf
函數(shù)從輸入的數(shù)據(jù)中定位適當(dāng)類型的項(xiàng),并在必要時(shí)跳過空格 - 然后
scanf
函數(shù)讀入數(shù)據(jù)項(xiàng)雁芙,并在遇到不可能屬于此項(xiàng)的字符時(shí)停止轧膘。 - 如果讀入數(shù)據(jù)項(xiàng)成功,那么
scanf
會(huì)繼續(xù)處理格式串的剩余部分却特;如果某一項(xiàng)不能成功讀入扶供,那么scanf
函數(shù)不再查看格式串的剩余部分(或者余下的輸入數(shù)據(jù))而立即返回。
- 從左邊開始處理字符串中的信息歉秫,對(duì)于格式串中的每一個(gè)轉(zhuǎn)換說明蛾洛,
在尋找數(shù)的起始位置時(shí)裂明,
scanf
函數(shù)會(huì)忽略空白字符(包括空格椿浓,水平和垂直制表太援,換頁,換行)-
識(shí)別數(shù)的規(guī)則:
- 整數(shù):首先尋找正號(hào)或負(fù)號(hào)扳碍,然后讀取數(shù)字直到讀到一個(gè)非數(shù)字停止
- 浮點(diǎn)數(shù):首先尋找一個(gè)正號(hào)或負(fù)號(hào)(可選)提岔,隨后是一串?dāng)?shù)字(可能含有小數(shù)點(diǎn)),再后是一個(gè)指數(shù)(可選)笋敞,指數(shù)由字母e(或E)碱蒙,可選符號(hào),和一個(gè)或多個(gè)數(shù)字構(gòu)成夯巷。
格式串中空白字符:當(dāng)在格式串中遇到一個(gè)或多個(gè)連續(xù)空白字符時(shí)赛惩,
scanf
函數(shù)從輸入中重復(fù)讀取空白字符直到遇到一個(gè)非空白字符(把該字符放回原處)為止。格式串中的一個(gè)空白字符可以與輸入中任意數(shù)量的空白字符匹配趁餐,包括零個(gè)喷兼。scanf
中%d只能與十進(jìn)制形式的整數(shù)匹配,而%i可以匹配八進(jìn)制(0開頭)后雷,十六進(jìn)制(0x或0X)或十進(jìn)制形式的整數(shù)匹配季惯。
-
第四章
算術(shù)運(yùn)算符
- 運(yùn)算符/的兩個(gè)操作數(shù)均為整數(shù),丟掉分?jǐn)?shù)部分來截取結(jié)果
- 運(yùn)算符%要求操作數(shù)時(shí)整數(shù)臀突,否則無法編譯通過
- /和%用于負(fù)數(shù)時(shí)結(jié)果難以確定:C89如果兩個(gè)操作數(shù)有一個(gè)是負(fù)數(shù)勉抓,那么結(jié)果可以向上也可以向下取整;C99除法結(jié)果總是向零截取候学,i%j的值的符號(hào)與i的相同藕筋。C89和C99都需要確保
(a/b)*b+a%b
的結(jié)果總是等于a。問題在于C89中a/b
和a%b
有兩種情況可以滿足梳码。C99出現(xiàn)時(shí)念逞,大多數(shù)cpu都對(duì)除法的結(jié)果向零取整,因此這也被寫入標(biāo)準(zhǔn)边翁,作為唯一允許的結(jié)果。
賦值運(yùn)算符
- 極少數(shù)情況下硕盹,由于
a
本身的副作用符匾,a+=b
和a=a+b
也不等同。a=a+b
只會(huì)對(duì)a進(jìn)行一次求值瘩例,而計(jì)算a=a+b
則會(huì)對(duì)a進(jìn)行兩次求值啊胶。例:a[i++]+=2;
中i只自增一次,而a[i++] = a[i++] + 2;
由于i的值在別處修改了垛贤,所以結(jié)果是未定義的焰坪。
自增和自減運(yùn)算符
- 對(duì)于現(xiàn)代編譯器,使用
++
和--
不會(huì)使編譯后的結(jié)果更短或更快聘惦,繼續(xù)普及主要是因?yàn)楹啙嵑捅憷?/li> -
++
和--
可以用于處理浮點(diǎn)數(shù) - 詞法分析中的“貪心法”:每一個(gè)符號(hào)應(yīng)該包含盡可能多的字符某饰。
- 子表達(dá)式的求值順序(兩個(gè)例子中第二條語句的結(jié)果都是未定義的):
a=5;c = (b=a+2) - (a=1);
i=2;j = i + i++;
- C沒有規(guī)定子表達(dá)式的求值順序(除了含有
","
,"?:"
,"&&"
黔漂,"||"
的子表達(dá)式)
第五章
- 條件表達(dá)式使程序更短小诫尽,也更難以閱讀,應(yīng)避免使用
- C99中提供了
_Bool
類型炬守,還提供了頭牧嫉,其中提供了bool
宏,用來代表_Bool
减途。還提供了true
和false
兩個(gè)宏
第六章
-
for
語句的三個(gè)表達(dá)式可以任意或全部省略 - C99中第一個(gè)表達(dá)式可以替換為一個(gè)聲明
- C99中酣藻,
goto
語句不可以用于繞過變長數(shù)組