第一二三四五六章

第一二三四五六章

第一章

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ù)
    • 工作方式:

      1. 從左邊開(kāi)始處理字符串中的信息,對(duì)于格式串中的每一個(gè)轉(zhuǎn)換說(shuō)明,scanf函數(shù)從輸入的數(shù)據(jù)中定位適當(dāng)類型的項(xiàng),并在必要時(shí)跳過(guò)空格
      2. 然后scanf函數(shù)讀入數(shù)據(jù)項(xiàng),并在遇到不可能屬于此項(xiàng)的字符時(shí)停止。
      3. 如果讀入數(shù)據(jù)項(xiàng)成功,那么scanf會(huì)繼續(xù)處理格式串的剩余部分;如果某一項(xiàng)不能成功讀入,那么scanf函數(shù)不再查看格式串的剩余部分(或者余下的輸入數(shù)據(jù))而立即返回。
    • 在尋找數(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/ba%b有兩種情況可以滿足。C99出現(xiàn)時(shí),大多數(shù)cpu都對(duì)除法的結(jié)果向零取整,因此這也被寫(xiě)入標(biāo)準(zhǔn),作為唯一允許的結(jié)果。

賦值運(yùn)算符

  • 極少數(shù)情況下,由于a本身的副作用,a+=ba=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。還提供了truefalse兩個(gè)宏

第六章

  • for語(yǔ)句的三個(gè)表達(dá)式可以任意或全部省略
  • C99中第一個(gè)表達(dá)式可以替換為一個(gè)聲明
  • C99中,goto語(yǔ)句不可以用于繞過(guò)變長(zhǎng)數(shù)組
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容