這本書(shū)按級(jí)別組織,編號(hào)從0到3。初始級(jí)別0,名為“邂逅”,它將總結(jié)使用C進(jìn)行編程的基礎(chǔ)知識(shí)。它的主要作用是提醒你我們所提到的主要概念,并使你熟悉C應(yīng)用的特殊詞匯。
第1級(jí)“相識(shí)”詳細(xì)描述了大多數(shù)主要概念和特性,如控制結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、操作符和函數(shù)。
第2級(jí)“相知”是C語(yǔ)言的核心,完全解釋了指針,使你熟悉C的內(nèi)存模型,并使你能夠理解C的大部分庫(kù)函數(shù)接口。
第3級(jí)“深入”詳細(xì)介紹了特定主題,如性能、可重復(fù)輸入、原子性、線(xiàn)程和泛類(lèi)型編程。
適讀人群 :C語(yǔ)言程序員及相關(guān)愛(ài)好者 C標(biāo)準(zhǔn)委員會(huì)積極審查和擴(kuò)展該語(yǔ)言,在2018年發(fā)布了更新的C標(biāo)準(zhǔn)。在本書(shū)中,Jens Gustedt(C標(biāo)準(zhǔn)文檔ISO/IEC 9899:2018的聯(lián)合編輯)將教你用經(jīng)過(guò)驗(yàn)證的語(yǔ)言編寫(xiě)相關(guān)程序所需的技能和特性?吹揭惠v賽車(chē)或加速它的引擎是一回事。坐在副駕駛位并與職業(yè)車(chē)手同乘是完全不同的體驗(yàn),這本書(shū)屬于后者。
本書(shū)基于新的C標(biāo)準(zhǔn),揭示了這種久經(jīng)考驗(yàn)的語(yǔ)言的現(xiàn)代視角。本書(shū)的目的是改變一種普遍的態(tài)度——C語(yǔ)言很少激發(fā)用戶(hù)學(xué)習(xí)更高層次知識(shí)的積極性,所以本書(shū)的內(nèi)容分為4級(jí),以反映對(duì)C語(yǔ)言和編程的熟悉程度。盡管本書(shū)會(huì)提出許多普遍適用的思想,但本書(shū)主要討論C語(yǔ)言中特有的或者在C語(yǔ)言編程時(shí)具有特殊價(jià)值的概念和實(shí)踐。
無(wú)論你是剛開(kāi)始使用C語(yǔ)言還是已經(jīng)有了非常豐富的經(jīng)驗(yàn),通過(guò)閱讀本書(shū),你的C語(yǔ)言編程技能都將提升到一個(gè)新的高度。這本非常全面的指南是按級(jí)別來(lái)組織的,這使你很容易找到適合自己的章節(jié),從而更快獲得更大的收益。
----------------------------------------
作為一種有50年歷史的編程語(yǔ)言,C語(yǔ)言還是非,F(xiàn)代的。無(wú)論是編寫(xiě)嵌入式代碼、低級(jí)系統(tǒng)例程,還是高性能應(yīng)用程序,C語(yǔ)言都能應(yīng)對(duì)挑戰(zhàn)。本書(shū)基于新的C標(biāo)準(zhǔn),從現(xiàn)代視角,深刻剖析了這種久經(jīng)考驗(yàn)的語(yǔ)言的概念及實(shí)踐應(yīng)用。
本書(shū)介紹C編程,強(qiáng)調(diào)了這種強(qiáng)大語(yǔ)言獨(dú)特和新穎的特性。為了滿(mǎn)足初級(jí)C程序員的需求,本書(shū)從結(jié)構(gòu)、語(yǔ)法、編譯和執(zhí)行等基礎(chǔ)知識(shí)開(kāi)始。然后,你將進(jìn)一步了解控制結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、操作符和函數(shù),從而更深入地了解在底層發(fā)生的事情。在最后幾章中,你將探索性能、可重入性、原子性、線(xiàn)程和泛類(lèi)型編程。你將在編寫(xiě)代碼的同時(shí)強(qiáng)化概念并磨煉技能。
本書(shū)的讀者對(duì)象是可以輕松使用Java、Python、Ruby、C#、C++或C語(yǔ)言編寫(xiě)簡(jiǎn)單程序的程序員。
主要內(nèi)容
● 運(yùn)算符和函數(shù)
● 指針、線(xiàn)程和原子性
● C的內(nèi)存模型
● 動(dòng)手練習(xí)
C編程語(yǔ)言已經(jīng)存在很長(zhǎng)時(shí)間了—它的權(quán)威參考資料是其創(chuàng)建者Kernighan和Ritchie寫(xiě)的一本書(shū)[1978]。從那時(shí)起,C語(yǔ)言就開(kāi)始被大量應(yīng)用。用C語(yǔ)言編寫(xiě)的程序和系統(tǒng)無(wú)處不在:個(gè)人計(jì)算機(jī)、電話(huà)、照相機(jī)、機(jī)頂盒、冰箱、汽車(chē)、大型機(jī)、衛(wèi)星……基本上在任何有可編程接口的現(xiàn)代設(shè)備中都能找到。
與C程序和系統(tǒng)的普遍存在相比,人們對(duì)C語(yǔ)言的認(rèn)知和了解要少得多。即便是經(jīng)驗(yàn)豐富的C程序員,也會(huì)對(duì)C語(yǔ)言的現(xiàn)代演變表現(xiàn)出一定程度的知識(shí)缺乏。一個(gè)可能的原因是,C語(yǔ)言被看作一種“容易學(xué)習(xí)”的語(yǔ)言,它允許缺乏經(jīng)驗(yàn)的程序員快速地編寫(xiě)或復(fù)制代碼段,這些代碼段至少看起來(lái)是在做它應(yīng)該做的事情。在某種程度上,C語(yǔ)言并沒(méi)有激發(fā)用戶(hù)學(xué)習(xí)更高層次知識(shí)的積極性。
本書(shū)的目的是改變這種普遍的態(tài)度,所以它的內(nèi)容分為4級(jí),以反映對(duì)C語(yǔ)言和編程的熟悉程度。這種結(jié)構(gòu)可能與讀者的一些習(xí)慣相違背,特別是,它將一些困難的主題(如指針)分成不同的層次,以避免過(guò)早地向讀者提供錯(cuò)誤的信息。我們稍后將更詳細(xì)地解釋本書(shū)的組織結(jié)構(gòu)。
一般來(lái)說(shuō),盡管本書(shū)會(huì)提出許多普遍適用的思想(也適用于其他編程語(yǔ)言如Java、Python、Ruby、C#或C++),但本書(shū)主要討論C語(yǔ)言中特有的或者在用C語(yǔ)言編程時(shí)具有特殊價(jià)值的概念和實(shí)踐。
C語(yǔ)言的版本
正如本書(shū)的書(shū)名所提示的那樣,今天的C語(yǔ)言與它的創(chuàng)建者Kernighan和Ritchie最初設(shè)計(jì)的C語(yǔ)言(通常稱(chēng)為K&R C)不同。特別是,它經(jīng)歷了一個(gè)重要的標(biāo)準(zhǔn)化和擴(kuò)展過(guò)程,現(xiàn)在由ISO(國(guó)際標(biāo)準(zhǔn)化組織)進(jìn)行推動(dòng)。這導(dǎo)致了在1989年、1999年、2011年和2018年一系列C標(biāo)準(zhǔn)的發(fā)布,它們通常被稱(chēng)為C89、C99、C11和C17。C標(biāo)準(zhǔn)委員會(huì)做了大量工作來(lái)保證向后兼容,比如用早期版本(如C89)編寫(xiě)的代碼應(yīng)該使用新版本的編譯器編譯成語(yǔ)義上等價(jià)的可執(zhí)行文件。不幸的是,這種向后兼容產(chǎn)生了我們不希望看到的副作用,即那些原本可以從新特性中獲益的項(xiàng)目沒(méi)有動(dòng)力來(lái)更新自己的代碼庫(kù)。
在本書(shū)中,我們將主要參考JTC1/SC22/WG14[2018]中定義的C17,但是在撰寫(xiě)本書(shū)時(shí),一些編譯器并沒(méi)有完全實(shí)現(xiàn)這個(gè)標(biāo)準(zhǔn)。如果你想編譯本書(shū)中的示例,至少需要一個(gè)可以實(shí)現(xiàn)C99大部分功能的編譯器。對(duì)于將C11添加到C99所要做的修改,使用一個(gè)仿真層(比如我的宏包P99)就足夠了,該軟件包可在 http://p99.gforge.inria.fr上找到。
C和C++
編程已經(jīng)成為一種非常重要的文化和經(jīng)濟(jì)活動(dòng),C語(yǔ)言仍然是編程界的一個(gè)重要元素。與所有人類(lèi)活動(dòng)一樣,C語(yǔ)言的進(jìn)步是由許多因素驅(qū)動(dòng)的:企業(yè)或個(gè)人的利益、政治、美、邏輯、運(yùn)氣、無(wú)知、自私、自我(這里加上你的主要?jiǎng)訖C(jī))。因此,C語(yǔ)言的發(fā)展不是也不可能是理想的。它存在缺陷和人為雕琢的成分,只能通過(guò)其歷史和社會(huì)背景來(lái)理解。
C語(yǔ)言開(kāi)發(fā)背景的一個(gè)重要部分是它的姊妹語(yǔ)言C++的早期出現(xiàn)。一個(gè)常見(jiàn)的誤解是,C++是通過(guò)添加自己的特性而從C演化而來(lái)的。盡管這在歷史上是正確的(C++是從非常早期的C語(yǔ)言發(fā)展而來(lái)的),但它們?cè)诮裉觳⒉皇翘貏e相關(guān)。事實(shí)上,C和C++在30多年前就已經(jīng)從一個(gè)共同的祖先中分離出來(lái),并且從那以后一直在獨(dú)立地發(fā)展。但是這兩種語(yǔ)言的演變并不是孤立發(fā)生的,多年來(lái),它們一直在交流和采納彼此的理念。一些新的特性,比如最近添加的原子性和線(xiàn)程,是在C和C++標(biāo)準(zhǔn)委員會(huì)的密切協(xié)作下設(shè)計(jì)的。
盡管如此,C和C++仍然有許多不同之處,而且本書(shū)中所講的全部?jī)?nèi)容都是關(guān)于C的,而不是C++。書(shū)中所給出的許多代碼示例甚至不能用C++編譯器編譯。因此我們不應(yīng)該把這兩種語(yǔ)言的起源混為一談。
要點(diǎn)A C和C++是不同的:不要將它們混淆。
注意,當(dāng)你閱讀本書(shū)的時(shí)候,你會(huì)遇到很多如上所示的要點(diǎn)。這些要點(diǎn)總結(jié)了特性、規(guī)則、建議等。在本書(shū)的末尾有一個(gè)包含了這些要點(diǎn)的列表,你可以把它作為一個(gè)備忘單。
要求
為了能夠從本書(shū)中獲益,你需要滿(mǎn)足一些基本要求。如果你對(duì)其中任何一個(gè)不確定,請(qǐng)先獲取或?qū)W習(xí)它們;否則,你可能會(huì)浪費(fèi)很多時(shí)間。
首先,如果不練習(xí),你就無(wú)法學(xué)習(xí)一門(mén)編程語(yǔ)言,所以你必須有一個(gè)適當(dāng)?shù)木幊汰h(huán)境(通常是在PC或筆記本電腦上),你必須在一定程度上掌握它。這個(gè)環(huán)境可以是集成的(一個(gè)IDE)或者是一組獨(dú)立的實(shí)用程序。平臺(tái)提供的內(nèi)容千差萬(wàn)別,因此很難給出具體建議。在類(lèi)似于UNIX的環(huán)境(如Linux和蘋(píng)果的macOS)中,你可以找到諸如emacs和vim之類(lèi)的編輯器,以及諸如c99、gcc和clang之類(lèi)的編譯器。
你必須能夠執(zhí)行以下操作:
1. 瀏覽文件系統(tǒng)。計(jì)算機(jī)上的文件系統(tǒng)通常按層次結(jié)構(gòu)組織在目錄中。你必須能夠?yàn)g覽它們來(lái)查找和操作文件。
2. 編輯程序文本。這與在字處理環(huán)境中編輯字母不同。你的環(huán)境、編輯器或它所調(diào)用的任何東西都應(yīng)該對(duì)編程語(yǔ)言C有基本的理解能力。你會(huì)看到,如果你打開(kāi)一個(gè)C文件(擴(kuò)展名通常為.C),它可能會(huì)突出顯示一些關(guān)鍵字,或者幫助你根據(jù){}的嵌套來(lái)縮進(jìn)代碼。
3. 執(zhí)行程序。你在這里看到的程序一開(kāi)始是非;A(chǔ)的,不會(huì)提供任何圖形功能。它們需要在命令行中啟動(dòng)。編譯器就是這樣一個(gè)例子。在像UNIX這樣的環(huán)境中,命令行通常被稱(chēng)為shell,其在控制臺(tái)或終端上啟動(dòng)。
4. 編譯程序文本。有些環(huán)境提供用于編譯的菜單按鈕或鍵盤(pán)快捷鍵。另一種方法是在終端的命令行中啟動(dòng)編譯器。這個(gè)編譯器必須遵照最新的標(biāo)準(zhǔn),不要把時(shí)間浪費(fèi)在不適宜的編譯器上。
如果你以前從未編寫(xiě)過(guò)程序,本書(shū)學(xué)起來(lái)會(huì)很難。了解以下內(nèi)容會(huì)有所幫助:Basic、C(歷史版本)、C++、Fortran、R、bash、JavaScript、Java、MATLAB、Perl、Python、Scilab等。但是,你可能有一些其他的編程經(jīng)驗(yàn), 甚至可能沒(méi)有注意到。許多技術(shù)規(guī)范實(shí)際上是用某種專(zhuān)用的語(yǔ)言編寫(xiě)的,可以作為一種類(lèi)比,例如,用于Web頁(yè)面的HTML和用于文檔格式化的LaTeX。
你應(yīng)該知道以下概念,盡管它們?cè)贑語(yǔ)言中的確切含義可能與你所學(xué)環(huán)境中的有所不同:
1. 變量—保存值的命名實(shí)體。
2. 條件句—在一個(gè)精確的條件下做某事(或不做某事)。
3. 循環(huán)—按一定的次數(shù)(或者直到滿(mǎn)足某個(gè)條件為止)重復(fù)做某事。
練習(xí)和挑戰(zhàn)
在本書(shū)中,你將看到一些練習(xí),這些練習(xí)是為了讓你思考所討論的概念。最好在閱讀本書(shū)時(shí)完成練習(xí)。還有一類(lèi)叫作“挑戰(zhàn)”。這些通常要求更高。你需要做一些研究,甚至要了解它們是什么,解決方案不會(huì)自己出現(xiàn):這需要努力。完成挑戰(zhàn)要花很多的時(shí)間,有時(shí)要幾個(gè)小時(shí)甚至幾天,這取決于你對(duì)工作的滿(mǎn)意程度。這些挑戰(zhàn)所涉及的主題來(lái)自我個(gè)人對(duì)“有趣問(wèn)題”的偏好,這些問(wèn)題來(lái)自我個(gè)人的經(jīng)歷。如果在學(xué)習(xí)或工作中有其他問(wèn)題或涉及相同領(lǐng)域的項(xiàng)目,你應(yīng)該也可以把它們做得同樣好。最重要的是要訓(xùn)練自己,首先從其他地方尋求幫助和想法,然后親自動(dòng)手把事情做好。你只有跳進(jìn)水里才能學(xué)會(huì)游泳。
本書(shū)結(jié)構(gòu)
本書(shū)按級(jí)別組織,編號(hào)從0到3。
第0級(jí)“邂逅”總結(jié)使用C語(yǔ)言進(jìn)行編程的基礎(chǔ)知識(shí)。它的主要作用是提醒你我們所提到的主要概念,并使你熟悉C應(yīng)用的特殊詞匯和觀(guān)點(diǎn)。最后,即使你在C語(yǔ)言編程方面沒(méi)有太多的經(jīng)驗(yàn),你應(yīng)該也能夠理解簡(jiǎn)單的C語(yǔ)言程序的結(jié)構(gòu),并可以開(kāi)始編寫(xiě)自己的程序。
第1級(jí)“相識(shí)”詳細(xì)描述大多數(shù)主要概念和特性,如控制結(jié)構(gòu)、數(shù)據(jù)類(lèi)型、操作符和函數(shù)。它應(yīng)該能讓你更深入地了解運(yùn)行程序時(shí)所發(fā)生的事情。這些知識(shí)對(duì)于算法入門(mén)課程和該級(jí)別的其他工作來(lái)說(shuō)應(yīng)該足夠了,但值得注意的是指針還沒(méi)有完全引入。
第2級(jí)“相知”深入C語(yǔ)言的核心。它完全解釋了指針,幫助你熟悉C語(yǔ)言的內(nèi)存模型,并使你能夠理解C語(yǔ)言的大部分庫(kù)函數(shù)接口。完成這一級(jí)別應(yīng)該使你能夠?qū)I(yè)地編寫(xiě)C代碼。因此,本級(jí)別首先對(duì)C程序的編寫(xiě)和組織進(jìn)行了必要的討論。我個(gè)人認(rèn)為,任何從工程學(xué)院畢業(yè)、主修計(jì)算機(jī)科學(xué)或C語(yǔ)言編程的人都能達(dá)到這個(gè)水平。不要滿(mǎn)足于比這更低的水平。
第3級(jí)“深入”詳細(xì)介紹特定主題,如性能、可重入性、原子性、線(xiàn)程和泛類(lèi)型編程。當(dāng)你在現(xiàn)實(shí)世界中遇到這些問(wèn)題的時(shí)候,你可能會(huì)發(fā)現(xiàn)這里的內(nèi)容是最好的。作為一個(gè)整體,它們對(duì)于結(jié)束討論并向你提供C語(yǔ)言方面的全部專(zhuān)業(yè)知識(shí)是必要的。任何在C語(yǔ)言方面具有多年專(zhuān)業(yè)編程經(jīng)驗(yàn)的人,或者使用C語(yǔ)言作為主要編程語(yǔ)言的軟件項(xiàng)目負(fù)責(zé)人,都應(yīng)該達(dá)到這個(gè)水平。
Jens Gustedt在波恩大學(xué)和柏林工業(yè)大學(xué)完成了他的數(shù)學(xué)學(xué)業(yè)。他當(dāng)時(shí)的研究涉及離散數(shù)學(xué)與高效計(jì)算的交叉。自1998年以來(lái),他一直在法國(guó)國(guó)家信息與自動(dòng)化研究所(INRIA)擔(dān)任高級(jí)科學(xué)家,先是在法國(guó)南錫的LORIA實(shí)驗(yàn)室工作,自2013年起在斯特拉斯堡的ICube實(shí)驗(yàn)室工作。
在整個(gè)職業(yè)生涯中,他的大部分科學(xué)研究一直伴隨著軟件的發(fā)展,一開(kāi)始主要是C++,然后又專(zhuān)注于C。他現(xiàn)在作為ISO委員會(huì)JTC1/SC22/WG14的專(zhuān)家為AFNOR服務(wù),并且是C標(biāo)準(zhǔn)文檔ISO/IEC 9899:2018的聯(lián)合編輯。他還有一個(gè)成功的博客,涉及C語(yǔ)言編程和相關(guān)主題:https://gustedt.wordpress.com。
【第0級(jí) 邂逅】
第1章 入門(mén) 2
1.1 命令式編程 3
1.2 編譯和運(yùn)行 4
第2章 程序的主要結(jié)構(gòu) 8
2.1 語(yǔ)法 8
2.2 聲明 10
2.3 定義 12
2.4 語(yǔ)句 13
2.4.1 循環(huán) 14
2.4.2 函數(shù)調(diào)用 14
2.4.3 函數(shù)返回 15
【第1級(jí) 相識(shí)】
第3章 一切都和控制有關(guān) 21
3.1 條件執(zhí)行 21
3.2 循環(huán) 24
3.3 多重選擇 28
第4章 表達(dá)式計(jì)算 31
4.1 算術(shù) 33
4.1.1 +、-和* 34
4.1.2 除法和余數(shù) 34
4.2 修改對(duì)象的運(yùn)算符 35
4.3 布爾情景 36
4.3.1 比較 36
4.3.2 邏輯 37
4.4 三元或條件運(yùn)算符 38
4.5 求值順序 39
第5章 基本值和數(shù)據(jù) 41
5.1 抽象狀態(tài)機(jī) 42
5.1.1 值 43
5.1.2 類(lèi)型 44
5.1.3 二進(jìn)制表示和抽象狀態(tài)機(jī) 44
5.1.4 優(yōu)化 45
5.2 基本類(lèi)型 46
5.3 指定值 49
5.4 隱式轉(zhuǎn)換 52
5.5 初始值設(shè)定 55
5.6 命名常量 56
5.6.1 只讀對(duì)象 57
5.6.2 枚舉 58
5.6.3 宏 59
5.6.4 復(fù)合字面量 60
5.7 二進(jìn)制表示 61
5.7.1 無(wú)符號(hào)整型 61
5.7.2 位集和按位運(yùn)算符 62
5.7.3 位移運(yùn)算符 63
5.7.4 布爾值 64
5.7.5 有符號(hào)整型 64
5.7.6 固定寬度整型 67
5.7.7 浮點(diǎn)數(shù)據(jù) 68
第6章 派生數(shù)據(jù)類(lèi)型 70
6.1 數(shù)組 71
6.1.1 數(shù)組聲明 71
6.1.2 數(shù)組操作 72
6.1.3 數(shù)組長(zhǎng)度 72
6.1.4 數(shù)組作為參數(shù) 73
6.1.5 字符串是特殊的 74
6.2 指針作為不透明類(lèi)型 77
6.3 結(jié)構(gòu) 79
6.4 類(lèi)型的新名稱(chēng):類(lèi)型別名 85
第7章 函數(shù) 87
7.1 簡(jiǎn)單函數(shù) 88
7.2 main是特殊的函數(shù) 90
7.3 遞歸 91
第8章 C庫(kù)函數(shù) 98
8.1 C庫(kù)函數(shù)的一般特性及功能 98
8.1.1 頭文件 99
8.1.2 接口 100
8.1.3 錯(cuò)誤檢查 100
8.1.4 邊界檢查接口 101
8.1.5 平臺(tái)前提條件 102
8.2 數(shù)學(xué) 103
8.3 輸入、輸出和文件操作 105
8.3.1 無(wú)格式文本輸出 105
8.3.2 文件和流 107
8.3.3 文本IO 109
8.3.4 格式化輸出 110
8.3.5 無(wú)格式文本輸入 113
8.4 字符串處理和轉(zhuǎn)換 115
8.5 時(shí)間 119
8.6 運(yùn)行時(shí)環(huán)境設(shè)置 123
8.7 程序終止和斷言 125
【第2級(jí) 相知】
第9章 風(fēng)格 130
9.1 格式 131
9.2 命名 132
第10章 組織與文檔 136
10.1 接口文檔 137
10.2 實(shí)現(xiàn) 139
10.2.1 宏 140
10.2.2 純函數(shù) 142
第11章 指針 147
11.1 指針操作 148
11.1.1 操作符的地址和對(duì)象 148
11.1.2 指針加法 149
11.1.3 指針減法和差 151
11.1.4 指針合法性 153
11.1.5 空指針 155
11.2 指針和結(jié)構(gòu) 156
11.3 指針和數(shù)組 159
11.3.1 數(shù)組訪(fǎng)問(wèn)和指針訪(fǎng)問(wèn)是一樣的 160
11.3.2 數(shù)組參數(shù)和指針參數(shù)是一樣的 160
11.4 函數(shù)指針 161
第12章 C內(nèi)存模型 167
12.1 統(tǒng)一內(nèi)存模型 168
12.2 union 169
12.3 內(nèi)存和狀態(tài) 171
12.4 指向非特定對(duì)象的指針 172
12.5 顯式轉(zhuǎn)換 173
12.6 有效類(lèi)型 175
12.7 對(duì)齊 176
第13章 存儲(chǔ) 179
13.1 malloc和友元 180
13.1.1 具有可變數(shù)組大小的
一個(gè)完整例子 181
13.1.2 確保動(dòng)態(tài)分配的一致性 188
13.2 存儲(chǔ)持續(xù)時(shí)間、生命周期和可見(jiàn)度 189
13.2.1 靜態(tài)存儲(chǔ)持續(xù)時(shí)間 192
13.2.2 自動(dòng)存儲(chǔ)持續(xù)時(shí)間 193
13.3 題外話(huà):在定義對(duì)象之前使用對(duì)象 194
13.4 初始化 196
13.5 題外話(huà):機(jī)器模型 198
第14章 涉及更多的處理和IO 202
14.1 文本處理 202
14.2 格式化輸入 209
14.3 擴(kuò)展字符集 210
14.4 二進(jìn)制流 218
14.5 錯(cuò)誤檢查和清理 219
【第3級(jí) 深入】
第15章 性能 226
15.1 內(nèi)聯(lián)函數(shù) 228
15.2 使用restrict限定符 232
15.3 測(cè)量和檢驗(yàn) 233
第16章 類(lèi)似函數(shù)的宏 242
16.1 類(lèi)似函數(shù)的宏如何工作 243
16.2 參數(shù)檢查 245
16.3 訪(fǎng)問(wèn)調(diào)用上下文 249
16.4 默認(rèn)參數(shù) 252
16.5 可變長(zhǎng)度參數(shù)列表 253
16.5.1 可變長(zhǎng)參數(shù)宏 253
16.5.2 繞道:可變長(zhǎng)參數(shù)函數(shù) 258
16.6 泛類(lèi)型編程 261
第17章 控制流中的變化 268
17.1 一個(gè)復(fù)雜的例子 270
17.2 排序 272
17.3 短跳轉(zhuǎn) 275
17.4 函數(shù) 276
17.5 長(zhǎng)跳轉(zhuǎn) 277
17.6 信號(hào)處理程序 281
第18章 線(xiàn)程 291
18.1 簡(jiǎn)單的線(xiàn)程間控制 294
18.2 無(wú)競(jìng)爭(zhēng)初始化和銷(xiāo)毀 296
18.3 線(xiàn)程本地?cái)?shù)據(jù) 299
18.4 臨界數(shù)據(jù)和臨界區(qū) 299
18.5 通過(guò)條件變量進(jìn)行通信 302
18.6 更復(fù)雜的線(xiàn)程管理 307
第19章 原子訪(fǎng)問(wèn)和內(nèi)存一致性 310
19.1 “以前發(fā)生的”關(guān)系 311
19.2 C庫(kù)調(diào)用提供同步 314
19.3 順序的一致性 316
19.4 其他一致性模型 318
要點(diǎn) 320
參考文獻(xiàn) 333