出版時(shí)間:2009-2 出版社:人民郵電出版社 作者:Steve Summit 頁(yè)數(shù):260 譯者:孫云,朱群英
Tag標(biāo)簽:無(wú)
前言
1979年的某段時(shí)間,我聽(tīng)到很多人在談?wù)揅這個(gè)當(dāng)時(shí)還挺新的語(yǔ)言和那本剛剛推出的書(shū)。我買了一本BrianKemighan和DenisRitchie寫(xiě)的ThecProgrammingLanguage(也稱K&R),但它在我的書(shū)架上空等了好一陣子,因?yàn)楫?dāng)時(shí)我并不急著需要它(況且我那時(shí)候還是一個(gè)余暇無(wú)多的大一新生)。后來(lái)證明這本書(shū)買得很幸運(yùn),因?yàn)楫?dāng)我最后拿起它以后,就再也沒(méi)有放下了:從那以后,我就一直在用C語(yǔ)言編程?! ?983年我結(jié)識(shí)了新聞組net.lang.c,這(以及它的后繼者comp.1ang.c)是一個(gè)絕佳的地方,你可以學(xué)習(xí)C語(yǔ)言的方方面面,發(fā)現(xiàn)別人關(guān)于C語(yǔ)言的各種疑問(wèn),認(rèn)識(shí)到你可能根本還沒(méi)有掌握關(guān)于C語(yǔ)言的一切。C語(yǔ)言盡管表面上很簡(jiǎn)單,但也還有一些并不顯而易見(jiàn)的方面,有些問(wèn)題不斷有人問(wèn)起。本書(shū)根據(jù)我從1990年5月開(kāi)始在comp.1ang.c上發(fā)布的常見(jiàn)問(wèn)題(FAQ)列表收集了這樣的一些問(wèn)題,并提供了答案?! ∪欢业寐暶?,這本書(shū)并不是對(duì)C語(yǔ)言的批評(píng)或誹謗。用戶在使用時(shí)遇到困難,很容易遷怒于語(yǔ)言(或其他任何工具)或者要求正確設(shè)計(jì)的工具“應(yīng)該”防止用戶的誤用。因此看到書(shū)中提及的各種誤用以后,很容易將這樣的書(shū)看作試圖顯示C語(yǔ)言的先天不足的長(zhǎng)篇控訴。這實(shí)在是遠(yuǎn)悖我的本意。 如果我不認(rèn)為C語(yǔ)言是一門偉大的語(yǔ)言,或者沒(méi)有在這種語(yǔ)言的編程中獲得那么多的樂(lè)趣,那我永遠(yuǎn)也學(xué)不到足夠的關(guān)于C語(yǔ)言的知識(shí)來(lái)寫(xiě)出本書(shū),而且也不會(huì)試圖寫(xiě)出本書(shū)來(lái)讓別人更愛(ài)用r語(yǔ)言。我很喜歡C語(yǔ)言,我教c的課并花時(shí)間參與網(wǎng)上討論的原因之一,就是希望發(fā)現(xiàn)這門語(yǔ)言(或者說(shuō)編程本身)在哪些方面比較難學(xué),讓人不易高效地編程。本書(shū)展示了我認(rèn)識(shí)到的部分內(nèi)容,這些問(wèn)題毫無(wú)疑問(wèn)就是人們遇到麻煩最多的,而答案則經(jīng)過(guò)多年的反復(fù)修正,就是為了消除人們的麻煩?! ∪绻@些答案中有任何錯(cuò)誤,那么讀者一定會(huì)遇到麻煩。盡管審稿人和我都盡力去除所有的錯(cuò)誤,但從一部手稿中根除最后一個(gè)錯(cuò)誤,就跟從程序中去掉最后一個(gè)bug一樣困難。通過(guò)出版社轉(zhuǎn)交或發(fā)往我的E.mail地址的任何修正和建議我都感激不盡。同時(shí)我也對(duì)任何錯(cuò)誤的第一個(gè)發(fā)現(xiàn)者按慣例提供$1.00的報(bào)酬。如果你能夠訪問(wèn)因特網(wǎng),你可以在問(wèn)題20.47提到的ftp和lhttp網(wǎng)址中找到一份勘誤表(和錯(cuò)誤發(fā)現(xiàn)者的積分表)。
內(nèi)容概要
本書(shū)以問(wèn)答的形式組織內(nèi)容,討論了學(xué)習(xí)或使用C語(yǔ)言的過(guò)程中經(jīng)常遇到的一些問(wèn)題。書(shū)中列出了C用戶經(jīng)常問(wèn)的400多個(gè)經(jīng)典問(wèn)題,涵蓋了初始化、數(shù)組、指針、字符串、內(nèi)存分配、庫(kù)函數(shù)、C預(yù)處理器等各個(gè)方面的主題,并分別給出了解答,而且結(jié)合代碼示例闡明要點(diǎn)?! ”緯?shū)結(jié)構(gòu)清晰,講解透徹,是各高校相關(guān)專業(yè)C語(yǔ)言課程很好的教學(xué)參考書(shū),也是各層次C程序員的優(yōu)秀實(shí)踐指南。
作者簡(jiǎn)介
Steve Summit,著名的C語(yǔ)言專家。Usenet C FAQ的創(chuàng)始人和維護(hù)者,有近30年的C編程經(jīng)驗(yàn)。畢業(yè)于麻省理工學(xué)院。他曾在華盛頓大學(xué)教授C語(yǔ)言課程多年。除本書(shū)外,他還與人合著了C Unleashed一書(shū)。
書(shū)籍目錄
第1章 聲明和初始化基本類型1.1 我該如何決定使用哪種整數(shù)類型?1.2 為什么不精確定義標(biāo)準(zhǔn)類型的大???1.3 因?yàn)镃語(yǔ)言沒(méi)有精確定義類型的大小,所以我一般都用typedef定義int16和int32。然后根據(jù)實(shí)際的機(jī)器環(huán)境把它們定義為int、short、long等類型。這樣看來(lái),所有的問(wèn)題都解決了,是嗎?1.4 新的64位機(jī)上的64位類型是什么樣的?指針聲明1.5 這樣的聲明有什么問(wèn)題?char *p1, p2; 我在使用p2的時(shí)候報(bào)錯(cuò)了。1.6 我想聲明一個(gè)指針,并為它分配一些空間,但卻不行。這樣的代碼有什么問(wèn)題?char *p; *p=malloc(10);聲明風(fēng)格1.7 怎樣聲明和定義全局變量和函數(shù)最好?1.8 如何在C中實(shí)現(xiàn)不透明(抽象)數(shù)據(jù)類型?1.9 如何生成“半全局變量”,就是那種只能被部分源文件中的部分函數(shù)訪問(wèn)的變量?存儲(chǔ)類型1.10 同一個(gè)靜態(tài)(static)函數(shù)或變量的所有聲明都必須包含static存儲(chǔ)類型嗎?1.11 extern在函數(shù)聲明中是什么意思?1.12 關(guān)鍵字auto到底有什么用途?類型定義(typedef)1.13 對(duì)于用戶定義類型,typedef 和#define有什么區(qū)別?1.14 我似乎不能成功定義一個(gè)鏈表。我試過(guò)typedef struct{char *item; NODEPTR next;}* NODEPTR; 但是編譯器報(bào)了錯(cuò)誤信息。難道在C語(yǔ)言中結(jié)構(gòu)不能包含指向自己的指針嗎?1.15 如何定義一對(duì)相互引用的結(jié)構(gòu)?1.16 Struct{ } x1;和typedef struct{ } x2; 這兩個(gè)聲明有什么區(qū)別?1.17 “typedef int(*funcptr)();”是什么意思?const 限定詞1.18 我有這樣一組聲明:typedef char *charp; const charp p; 為什么是p而不是它指向的字符為const?1.19 為什么不能像下面這樣在初始式和數(shù)組維度值中使用const值?const int n=5; int a[n];1.20 const char *p、char const *p和char *const p有什么區(qū)別?復(fù)雜的聲明1.21 怎樣建立和理解非常復(fù)雜的聲明?例如定義一個(gè)包含N個(gè)指向返回指向字符的指針的函數(shù)的指針的數(shù)組?1.22 如何聲明返回指向同類型函數(shù)的指針的函數(shù)?我在設(shè)計(jì)一個(gè)狀態(tài)機(jī),用函數(shù)表示每種狀態(tài),每個(gè)函數(shù)都會(huì)返回一個(gè)指向下一個(gè)狀態(tài)的函數(shù)的指針??晌艺也坏饺魏畏椒▉?lái)聲明這樣的函數(shù)——感覺(jué)我需要一個(gè)返回指針的函數(shù),返回的指針指向的又是返回指針的函數(shù),如此往復(fù),以至無(wú)窮。數(shù)組大小1.23 能否聲明和傳入數(shù)組大小一致的局部數(shù)組,或者由其他參數(shù)指定大小的參數(shù)數(shù)組?1.24 我在一個(gè)文件中定義了一個(gè)extern數(shù)組,然后在另一個(gè)文件中使用,為什么sizeof取不到數(shù)組的大小?聲明問(wèn)題1.25 函數(shù)只定義了一次,調(diào)用了一次,但編譯器提示非法重聲明了。1.26 main的正確定義是什么?void main正確嗎?1.27 我的編譯器總在報(bào)函數(shù)原型不匹配的錯(cuò)誤,可我覺(jué)得沒(méi)什么問(wèn)題。這是為什么?1.28 文件中的第一個(gè)聲明就報(bào)出奇怪的語(yǔ)法錯(cuò)誤,可我看沒(méi)什么問(wèn)題。這是為什么?1.29 為什么我的編譯器不允許我定義大數(shù)組,如double array[256][256]?命名空間1.30 如何判斷哪些標(biāo)識(shí)符可以使用,哪些被保留了?初始化1.31 對(duì)于沒(méi)有顯式初始化的變量的初始值可以作怎樣的假定?如果一個(gè)全局變量初始值為“零”,它可否作為空指針或浮點(diǎn)零?1.32 下面的代碼為什么不能編譯? intf(){char a[]="Hello, world!";}1.33 下面的初始化有什么問(wèn)題?編譯器提示“invalid initializers ”或其他信息。char *p=malloc(10);1.34 char a[]= "string literal";和char *p="string literal"; 初始化有什么區(qū)別?當(dāng)我向p[i] 賦值的時(shí)候,我的程序崩潰了。1.35 char a{[3]}= "abc"; 是否合法?1.36 我總算弄清楚函數(shù)指針的聲明方法了,但怎樣才能初始化呢?1.37 能夠初始化聯(lián)合嗎?第2章 結(jié)構(gòu)、聯(lián)合和枚舉結(jié)構(gòu)聲明2.1 struct x1{ };和typedef struct{ }x2; 有什么不同?2.2 這樣的代碼為什么不對(duì)?struct x{ }; x thestruct;2.3 結(jié)構(gòu)可以包含指向自己的指針嗎?2.4 在C語(yǔ)言中用什么方法實(shí)現(xiàn)抽象數(shù)據(jù)類型最好?2.5 在C語(yǔ)言中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?2.6 為什么聲明extern f(struct x *p); 給我報(bào)了一個(gè)晦澀難懂的警告信息?2.7 我遇到這樣聲明結(jié)構(gòu)的代碼:struct name {int namelen; char namestr[1];};然后又使用一些內(nèi)存分配技巧使namestr數(shù)組用起來(lái)好像有多個(gè)元素,namelen記錄了元素個(gè)數(shù)。它是怎樣工作的?這樣是合法的和可移植的嗎?2.8 我聽(tīng)說(shuō)結(jié)構(gòu)可以賦給變量也可以對(duì)函數(shù)傳入和傳出。為什么K&R1卻明確說(shuō)明不能這樣做?2.9 為什么不能用內(nèi)建的==和!=操作符比較結(jié)構(gòu)?2.10 結(jié)構(gòu)傳遞和返回是如何實(shí)現(xiàn)的?2.11 如何向接受結(jié)構(gòu)參數(shù)的函數(shù)傳入常量值?怎樣創(chuàng)建無(wú)名的中間的常量結(jié)構(gòu)值?2.12 怎樣從/向數(shù)據(jù)文件讀/寫(xiě)結(jié)構(gòu)?結(jié)構(gòu)填充2.13 為什么我的編譯器在結(jié)構(gòu)中留下了空洞?這導(dǎo)致空間浪費(fèi)而且無(wú)法與外部數(shù)據(jù)文件進(jìn)行“二進(jìn)制”讀寫(xiě)。能否關(guān)掉填充,或者控制結(jié)構(gòu)域的對(duì)齊方式?2.14 為什么sizeof返回的值大于結(jié)構(gòu)大小的期望值,是不是尾部有填充?2.15 如何確定域在結(jié)構(gòu)中的字節(jié)偏移量?2.16 怎樣在運(yùn)行時(shí)用名字訪問(wèn)結(jié)構(gòu)中的域?2.17 C語(yǔ)言中有和Pascal的with等價(jià)的語(yǔ)句嗎?2.18 既然數(shù)組名可以用作數(shù)組的基地址,為什么對(duì)結(jié)構(gòu)不能這樣?2.19 程序運(yùn)行正確,但退出時(shí)卻“core dump ”(核心轉(zhuǎn)儲(chǔ))了,怎么回事?聯(lián)合2.20 結(jié)構(gòu)和聯(lián)合有什么區(qū)別?2.21 有辦法初始化聯(lián)合嗎?2.22 有沒(méi)有一種自動(dòng)方法來(lái)跟蹤聯(lián)合的哪個(gè)域在使用?枚舉2.23 枚舉和一組預(yù)處理的#define有什么不同?2.24 枚舉可移植嗎?2.25 有什么顯示枚舉值符號(hào)的容易方法嗎?位域2.26 一些結(jié)構(gòu)聲明中的這些冒號(hào)和數(shù)字是什么意思?2.27 為什么人們那么喜歡用顯式的掩碼和位操作而不直接聲明位域?第3章 表達(dá)式求值順序3.1 為什么這樣的代碼不行?a[i]= i++;3.2 使用我的編譯器,下面的代碼int i= 7; printf("%d\n", i++ * i++); 打印出49。不管按什么順序計(jì)算,難道不該是56嗎?3.3 對(duì)于代碼int i=3; i=i++; 不同編譯器給出不同的i值,有的為3,有的為4,哪個(gè)是正確的?3.4 有這樣一個(gè)巧妙的表達(dá)式:a^= b^= a^= b; 它不需要臨時(shí)變量就可以交換a和b的值。3.5 可否用顯式括號(hào)來(lái)強(qiáng)制執(zhí)行我所需要的計(jì)算順序并控制相關(guān)的副作用?就算括號(hào)不行,操作符優(yōu)先級(jí)是否能夠控制計(jì)算順序呢?3.6 可是&&和||操作符呢?我看到過(guò)類似while((c = getchar()) != EOF && c != \n)的代碼3.7 是否可以安全地認(rèn)為,一旦&&和||左邊的表達(dá)式已經(jīng)決定了整個(gè)表達(dá)式的結(jié)果,則右邊的表達(dá)式不會(huì)被求值?3.8 為什么表達(dá)式printf("%d %d", f1(), f2()); 先調(diào)用了f2?我覺(jué)得逗號(hào)表達(dá)式應(yīng)該確保從左到右的求值順序。3.9 怎樣才能理解復(fù)雜表達(dá)式并避免寫(xiě)出未定義的表達(dá)式?“序列點(diǎn)”是什么?3.10 在a[i] = i++;中,如果不關(guān)心a[]的哪一個(gè)分量會(huì)被寫(xiě)入,這段代碼就沒(méi)有問(wèn)題,i也的確會(huì)增加1,對(duì)嗎?3.11 人們總是說(shuō)i=i++的行為是未定義的??晌覄倓傇谝粋€(gè)ANSI編譯器上嘗試過(guò),其結(jié)果正如我所期望的。3.12 我不想學(xué)習(xí)那些復(fù)雜的規(guī)則,怎樣才能避免這些未定義的求值順序問(wèn)題呢?其他的表達(dá)式問(wèn)題3.13 ++i和i++有什么區(qū)別?3.14 如果我不使用表達(dá)式的值,那我應(yīng)該用i++還是++i來(lái)做自增呢?3.15 我要檢查一個(gè)數(shù)是不是在另外兩個(gè)數(shù)之間,為什么if(a b c)不行?3.16 為什么如下的代碼不對(duì)?int a=1000, b=1000; long int c=a * b;3.17 為什么下面的代碼總是給出0?double degC, degF; degC= 5.0 / 9 * (degF - 32);3.18 需要根據(jù)條件把一個(gè)復(fù)雜的表達(dá)式賦給兩個(gè)變量中的一個(gè)??梢杂孟旅孢@樣的代碼嗎?((condition) ? a : b)= complicated_expression;3.19 我有些代碼包含這樣的表達(dá)式。a ? b=c : d 有些編譯器可以接受,有些卻不能。為什么?保護(hù)規(guī)則3.20 “semantics of‘’change in ANSI C”的警告是什么意思?3.21 “無(wú)符號(hào)保護(hù)”和“值保護(hù)”規(guī)則的區(qū)別在哪里?第4章 指針基本的指針應(yīng)用4.1 指針到底有什么好處?4.2 我想聲明一個(gè)指針并為它分配一些空間,但卻不行。這些代碼有什么問(wèn)題呢?char *p; *p =malloc(10);4.3 *p++自增p還是p所指向的變量?指針操作4.4 我用指針操作int數(shù)組的時(shí)候遇到了麻煩。4.5 我有一個(gè)char *型指針碰巧指向一些int型變量,我想跳過(guò)它們。為什么((int *)p)++; 這樣的代碼不行?4.6 為什么不能對(duì)void *指針進(jìn)行算術(shù)操作?4.7 我有些解析外部結(jié)構(gòu)的代碼,但是它卻崩潰了,顯示出了“unaligned access”(未對(duì)齊的訪問(wèn))的信息。這是什么意思?作為函數(shù)參數(shù)的指針4.8 我有個(gè)函數(shù),它應(yīng)該接受并初始化一個(gè)指針:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是當(dāng)我如下調(diào)用時(shí):int *ip; f(ip); 調(diào)用者的指針沒(méi)有任何變化。4.9 能否用void ** 通用指針作為參數(shù),使函數(shù)模擬按引用傳遞參數(shù)? 484.10 我有一個(gè)函數(shù)extern intf(int *); ,它接受指向int型的指針。我怎樣用引用方式傳入一個(gè)常數(shù)?調(diào)用f(&5);似乎不行。4.11 C語(yǔ)言可以“按引用傳參”嗎?其他指針問(wèn)題4.12 我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么回事?4.13 通用指針類型是什么?當(dāng)我把函數(shù)指針賦向void *類型的時(shí)候,編譯通不過(guò)。4.14 怎樣在整型和指針之間進(jìn)行轉(zhuǎn)換?能否暫時(shí)把整數(shù)放入指針變量中,或者相反?4.15 我怎樣把一個(gè)int變量轉(zhuǎn)換為char *型?我試了類型轉(zhuǎn)換,但是不行。第5章 空指針空指針和空指針常量5.1 臭名昭著的空指針到底是什么?5.2 怎樣在程序里獲得一個(gè)空指針?5.3 用縮寫(xiě)的指針比較“if(p)”檢查空指針是否有效?如果空指針的內(nèi)部表達(dá)不是0會(huì)怎樣?NULL 宏5.4 NULL是什么,它是怎么定義的?5.5 在使用非零位模式作為空指針的內(nèi)部表示的機(jī)器上,NULL 是如何定義的?5.6 如果NULL定義成#define NULL((char *)0) ,不就可以向函數(shù)傳入不加轉(zhuǎn)換的NULL 了嗎?5.7 我的編譯器提供的頭文件中定義的NULL為0L。為什么?5.8 NULL可以合法地用作函數(shù)指針嗎?5.9 如果NULL和0作為空指針常量是等價(jià)的,那我到底該用哪一個(gè)呢?5.10 但是如果NULL的值改變了,比如在使用非零內(nèi)部空指針的機(jī)器上,用NULL(而不是0)不是更好嗎?5.11 我曾經(jīng)使用過(guò)一個(gè)編譯器,不使用NULL就不能編譯。5.12 我用預(yù)處理宏#define Nullptr(type)(type *)0幫助創(chuàng)建正確類型的空指針?;仡?.13 這有點(diǎn)奇怪:NULL可以確保是0,但空(null)指針卻不一定?5.14 為什么有那么多關(guān)于空指針的疑惑?為什么這些問(wèn)題如此頻繁地出現(xiàn)?5.15 有沒(méi)有什么簡(jiǎn)單點(diǎn)兒的辦法理解所有這些與空指針有關(guān)的東西呢?5.16 考慮到有關(guān)空指針的所有這些困惑,要求它們的內(nèi)部表示都必須為0不是更簡(jiǎn)單嗎?5.17 說(shuō)真的,真有機(jī)器用非零空指針嗎,或者不同類型用不同的表示?地址0上到底有什么?5.18 運(yùn)行時(shí)的整數(shù)值0轉(zhuǎn)換為指針以后一定是空指針嗎?5.19 如何訪問(wèn)位于機(jī)器地址0處的中斷向量?如果我將指針值設(shè)為0,編譯器可能會(huì)自動(dòng)將它轉(zhuǎn)換為非零的空指針內(nèi)部表示。5.20 運(yùn)行時(shí)的“null pointer assignment”錯(cuò)誤是什么意思?應(yīng)該怎樣捕捉它?第6章 數(shù)組和指針數(shù)組和指針的基本關(guān)系6.1 我在一個(gè)源文件中定義了char a[6],在另一個(gè)源文件中聲明了extern char *a。為什么不行?6.2 可是我聽(tīng)說(shuō)char a[]和char *a是等價(jià)的。是這樣的嗎?6.3 那么,在C語(yǔ)言中“指針和數(shù)組等價(jià)”到底是什么意思?6.4 既然它們這么不同,那為什么作為函數(shù)形參的數(shù)組和指針聲明可以互換呢?數(shù)組不能被賦值6.5 為什么不能這樣向數(shù)組賦值?extern char *getpass(); char str[10]; str=getpass("Enter password:");6.6 既然不能向數(shù)組賦值,那這段代碼為什么可以呢?int f(char str[]){ if(str[0] == \0) str="none";}6.7 如果你不能給它賦值,那么數(shù)組如何能成為左值呢?回顧6.8 現(xiàn)實(shí)地講,數(shù)組和指針的區(qū)別是什么?6.9 有人跟我講,數(shù)組不過(guò)是常指針。這樣講準(zhǔn)確嗎?6.10 我還是很困惑。到底指針是一種數(shù)組,還是數(shù)組是一種指針?6.11 我看到一些“搞笑”的代碼,包含5["abcdef"]這樣的“表達(dá)式”。這為什么是合法的C語(yǔ)言表達(dá)式呢?數(shù)組的指針6.12 既然數(shù)組引用會(huì)退化為指針,如果array是數(shù)組,那么array和&array又有什么區(qū)別呢?6.13 如何聲明一個(gè)數(shù)組的指針?動(dòng)態(tài)數(shù)組分配6.14 如何在運(yùn)行時(shí)設(shè)定數(shù)組的大???怎樣才能避免固定大小的數(shù)組?6.15 我如何聲明大小和傳入的數(shù)組一樣的局部數(shù)組?6.16 如何動(dòng)態(tài)分配多維數(shù)組?6.17 有個(gè)很好的竅門,如果我這樣寫(xiě):int realarray[10]; int *array = &realarray[-1]; 我就可以把“array”當(dāng)作下標(biāo)從1 開(kāi)始的數(shù)組。函數(shù)和多維數(shù)組6.18 當(dāng)我向一個(gè)接受指針的指針的函數(shù)傳入二維數(shù)組的時(shí)候,編譯器報(bào)錯(cuò)了。6.19 我怎樣編寫(xiě)接受編譯時(shí)寬度未知的二維數(shù)組的函數(shù)?6.20 我怎樣在函數(shù)參數(shù)傳遞時(shí)混用靜態(tài)和動(dòng)態(tài)多維數(shù)組?數(shù)組的大小6.21 當(dāng)數(shù)組是函數(shù)的參數(shù)時(shí),為什么sizeof不能正確報(bào)告數(shù)組的大小?6.22 如何在一個(gè)文件中判斷聲明為extern的數(shù)組的大小(例如,數(shù)組定義和大小在另一個(gè)文件中)?sizeof操作符似乎不行。6.23 sizeof返回的大小是以字節(jié)計(jì)算的,怎樣才能判斷數(shù)組中有多少個(gè)元素呢?第7章 內(nèi)存分配第8章 字符和字符串第9章 布爾表達(dá)式和變量第10章 C預(yù)處理器第11章 ANSI/ISO標(biāo)準(zhǔn)C第12章 標(biāo)準(zhǔn)輸入輸出庫(kù)第13章 庫(kù)函數(shù)第14章 浮點(diǎn)運(yùn)算第15章 可變參數(shù)列表第16 章 奇怪的問(wèn)題第17章 風(fēng)格第18章 工具和資源第19章 系統(tǒng)依賴第20章 雜項(xiàng)術(shù)語(yǔ)表參考文獻(xiàn)
章節(jié)摘錄
第1章 聲明和初始化 C語(yǔ)言的聲明語(yǔ)法本身實(shí)際上就是一種小的編程語(yǔ)言。一個(gè)聲明包含如下幾個(gè)部分(但是并非都必不可少):存儲(chǔ)類型、基本類型、類型限定詞和最終的聲明符(也可能包含初始化列表)。每個(gè)聲明符不僅聲明一個(gè)新的標(biāo)識(shí)符,同時(shí)也表明標(biāo)識(shí)符是數(shù)組、指針、函數(shù)還是其他任意的復(fù)雜組合?;镜乃枷胧亲屄暶鞣7聵?biāo)識(shí)符的最終用法。(問(wèn)題1.21將會(huì)更加詳細(xì)地討論這種“聲明模仿使用”的關(guān)系?。 』绢愋汀 ∽屢恍┏绦騿T驚奇的是,盡管C語(yǔ)言是一種相當(dāng)?shù)图?jí)的語(yǔ)言,但它的類型體系仍然略顯抽象。語(yǔ)言本身并沒(méi)有精確定義基本類型的大小和表示法?! ?wèn):我該如何決定使用哪種整數(shù)類型? 答:如果可能用到很大的數(shù)值(大于32 767或小于一32 767),就使用lon9型。否則,如果空間很重要(例如有很大的數(shù)組或很多的結(jié)構(gòu)),就使用short型。除此之外,就用int型。如果定義明確的溢出特征很重要而負(fù)值無(wú)關(guān)緊要,或者希望在操作二進(jìn)制位和字節(jié)時(shí)避免符號(hào)擴(kuò)展的問(wèn)題,請(qǐng)使用對(duì)應(yīng)的unsigned類型。(但是,在表達(dá)式中混用有符號(hào)和無(wú)符號(hào)值的時(shí)候,要特別注意。參見(jiàn)問(wèn)題3.21。) 盡管字符類型(尤其是unsigned char型)可以當(dāng)成“小”整數(shù)使用,但這樣做有時(shí)候很麻煩,不值得。編譯器需要生成額外的代碼來(lái)進(jìn)行char型和int型之間的轉(zhuǎn)換(導(dǎo)致目標(biāo)代碼量增大),而且不可預(yù)知的符號(hào)擴(kuò)展也會(huì)帶來(lái)一堆麻煩。(使用unsigned char會(huì)有所幫助。類似的問(wèn)題參見(jiàn)問(wèn)題12.1。) 在決定使用float型還是double型時(shí)也有類似的空間/時(shí)間權(quán)衡。(很多編譯器在表達(dá)式求值的時(shí)候仍然把所有的float型轉(zhuǎn)換為double型進(jìn)行運(yùn)算)。但如果一個(gè)變量的地址確定且必須為特定的類型時(shí),以上規(guī)則就不再適用?! 『芏鄷r(shí)候,人們錯(cuò)誤地認(rèn)為C語(yǔ)言類型的大小都有精確的定義。事實(shí)上,能夠確保的只有如下幾點(diǎn):
媒體關(guān)注與評(píng)論
“本書(shū)是Summit以及C FAQ在線列表的許多參與者多年心血的結(jié)晶,是C語(yǔ)言界最為珍貴的財(cái)富之一。我向所有C語(yǔ)言程序員推薦本書(shū)?!? ——Francis Glassborow,著名C/C++專家,ACCU(C/C++用戶協(xié)會(huì))前主席 “本書(shū)清晰地闡明了Kernighan與Ritchie的The C Programming Language一書(shū)中許多簡(jiǎn)略的地方,而且精彩地總結(jié)了C語(yǔ)言編程實(shí)踐,強(qiáng)烈推薦!” ——Yechiel M.Kimchi,以色列理工學(xué)院
編輯推薦
全球C語(yǔ)言程序員集體智慧的結(jié)晶 Amazon全五星圖書(shū) 權(quán)威解答495個(gè)最常遇到的C語(yǔ)言問(wèn)題 C是一門簡(jiǎn)潔精妙的語(yǔ)言,掌握基本語(yǔ)法容易,真正能夠自如運(yùn)用,就不那么簡(jiǎn)單了。你難免會(huì)遇到各種各樣的問(wèn)題,有些可能讓你百思不得其解,甚至翻遍圖書(shū)館,也找不到問(wèn)題的答案?! 赌惚仨氈赖?95個(gè)C語(yǔ)言問(wèn)題》的出版填補(bǔ)了這一空白。書(shū)中內(nèi)容是世界各地的C語(yǔ)言用戶多年來(lái)在新聞組comp.1ang.c中討論的成果。作者在網(wǎng)絡(luò)版CFAQ列表的基礎(chǔ)上進(jìn)行了大幅度的擴(kuò)充和豐富,結(jié)合代碼示例,權(quán)威而且詳細(xì)深入地解答了實(shí)際學(xué)習(xí)和工作中最常遇到的495個(gè)C語(yǔ)言問(wèn)題,涵蓋了初始化、數(shù)組、指針、字符串、內(nèi)存分配、庫(kù)函數(shù)、C預(yù)處理器等各個(gè)方面的主題。許多知識(shí)點(diǎn)的闡述都是其他資料中所沒(méi)有的,彌足珍貴?! 『wC99標(biāo)準(zhǔn) “本書(shū)是Summit以及C FAQ在線列表的許多參與者多年心血的結(jié)晶,是C語(yǔ)言界最為珍貴的財(cái)富之一。我向所有C語(yǔ)言程序員推薦本書(shū)?!? ——Francis Glassborow,著名C/C++專家,ACCU(C/C++用戶協(xié)會(huì))前主席 “本書(shū)清晰地闡明了Kernighan與Ritchie的The C Programming Language一書(shū)中許多簡(jiǎn)略的地方,而且精彩地總結(jié)了C語(yǔ)言編程實(shí)踐,強(qiáng)烈推薦!” ——Yechiel M.Kimchi,以色列理工學(xué)院
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
你必須知道的495個(gè)C語(yǔ)言問(wèn)題 PDF格式下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版