第一二三四五六章
第一章
C語(yǔ)言是一種
- 底層語(yǔ)言
- 小型語(yǔ)言
- 包容性語(yǔ)言
優(yōu)點(diǎn):
- 高效
- 可移植
- 功能強(qiáng)大
- 靈活
- 標(biāo)準(zhǔn)庫(kù)
- 與UNIX系統(tǒng)的集成
缺點(diǎn):
- C程序更容易隱藏錯(cuò)誤
- C程序可能會(huì)難以理解
- C程序可能會(huì)難以修改
高效的使用C語(yǔ)言
- 學(xué)習(xí)如何規(guī)避C語(yǔ)言的缺陷:《C陷阱與缺陷》
- 使用軟件工具使程序更可靠:lint,splint
- 利用現(xiàn)有的代碼庫(kù)
- 采用一套切合實(shí)際的編碼規(guī)范
- 避免“投機(jī)取巧”和極度復(fù)雜的代碼
- 緊貼標(biāo)準(zhǔn)
第二章
- 指令:預(yù)處理器執(zhí)行的命令
- 函數(shù):一系列組合在一起并且賦予了名字的語(yǔ)句
- 語(yǔ)句:程序運(yùn)行時(shí)執(zhí)行的命令
- 聲明:變量使用前必須對(duì)其進(jìn)行聲明。
- C99:聲明可以不在語(yǔ)句之前
- 賦值:變量通過(guò)賦值的方式獲得值
- C通用原則:在任何需要數(shù)值的地方,都可以使用具有相同類型的表達(dá)式
- 標(biāo)識(shí)符受限的情況:
- 關(guān)鍵字
- 某些編譯器吧特定的標(biāo)識(shí)符(如asm)視為附加關(guān)鍵字
- 以下劃線開(kāi)頭
- C89指出以下劃線后跟一個(gè)大寫(xiě)字母開(kāi)頭的名字是保留字,程序員不應(yīng)使用
- 根據(jù)C標(biāo)準(zhǔn),編譯器必須用一個(gè)空格字符替換每條注釋語(yǔ)句
- 標(biāo)識(shí)符長(zhǎng)度:
- C89標(biāo)準(zhǔn)聲稱標(biāo)識(shí)符可以任意長(zhǎng),但只要求編譯器記住前31個(gè)字符(C99中是63個(gè))
- 對(duì)于具有外部鏈接的標(biāo)識(shí)符,C89中只有前6個(gè)字符才是有效的,并且不區(qū)分大小寫(xiě);C99中,前31個(gè)字符有效,且字母區(qū)分大小寫(xiě)
- 大多數(shù)編譯器和鏈接器都比標(biāo)準(zhǔn)要求的寬松
- Horner法則
第三章
-
scanf函數(shù)-
工作方式:
- 從左邊開(kāi)始處理字符串中的信息,對(duì)于格式串中的每一個(gè)轉(zhuǎn)換說(shuō)明,
scanf函數(shù)從輸入的數(shù)據(jù)中定位適當(dāng)類型的項(xiàng),并在必要時(shí)跳過(guò)空格 - 然后
scanf函數(shù)讀入數(shù)據(jù)項(xiàng),并在遇到不可能屬于此項(xiàng)的字符時(shí)停止。 - 如果讀入數(shù)據(jù)項(xiàng)成功,那么
scanf會(huì)繼續(xù)處理格式串的剩余部分;如果某一項(xiàng)不能成功讀入,那么scanf函數(shù)不再查看格式串的剩余部分(或者余下的輸入數(shù)據(jù))而立即返回。
- 從左邊開(kāi)始處理字符串中的信息,對(duì)于格式串中的每一個(gè)轉(zhuǎn)換說(shuō)明,
在尋找數(shù)的起始位置時(shí),
scanf函數(shù)會(huì)忽略空白字符(包括空格,水平和垂直制表,換頁(yè),換行)-
識(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開(kāi)頭),十六進(jìn)制(0x或0X)或十進(jìn)制形式的整數(shù)匹配。
-
第四章
算術(shù)運(yùn)算符
- 運(yùn)算符/的兩個(gè)操作數(shù)均為整數(shù),丟掉分?jǐn)?shù)部分來(lái)截取結(jié)果
- 運(yùn)算符%要求操作數(shù)時(shí)整數(shù),否則無(wú)法編譯通過(guò)
- /和%用于負(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。問(wèn)題在于C89中a/b和a%b有兩種情況可以滿足。C99出現(xiàn)時(shí),大多數(shù)cpu都對(duì)除法的結(jié)果向零取整,因此這也被寫(xiě)入標(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)楹?jiǎn)潔和便利。 -
++和--可以用于處理浮點(diǎn)數(shù) - 詞法分析中的“貪心法”:每一個(gè)符號(hào)應(yīng)該包含盡可能多的字符。
- 子表達(dá)式的求值順序(兩個(gè)例子中第二條語(yǔ)句的結(jié)果都是未定義的):
a=5;c = (b=a+2) - (a=1);i=2;j = i + i++;- C沒(méi)有規(guī)定子表達(dá)式的求值順序(除了含有
",","?:","&&","||"的子表達(dá)式)
第五章
- 條件表達(dá)式使程序更短小,也更難以閱讀,應(yīng)避免使用
- C99中提供了
_Bool類型,還提供了頭,其中提供了bool宏,用來(lái)代表_Bool。還提供了true和false兩個(gè)宏
第六章
-
for語(yǔ)句的三個(gè)表達(dá)式可以任意或全部省略 - C99中第一個(gè)表達(dá)式可以替換為一個(gè)聲明
- C99中,
goto語(yǔ)句不可以用于繞過(guò)變長(zhǎng)數(shù)組