




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C語(yǔ)言常見(jiàn)問(wèn)題集
原著:SteveSummit
翻譯:朱群英,孫云
修訂版0.9.4,2005年6月23日
版權(quán)所有c2005
目錄
目錄i
刖百XVII
1聲明和初始化1
1.1我如何決定使用那種整數(shù)類型?........
1.264位機(jī)上的64位類型是什么樣的?......1
1.3怎樣定義和聲明全局變量和函數(shù)最好?.....2
1.4extern在函數(shù)聲明中是什么意思?......2
1.5關(guān)鍵字auto到底有什么用途?.......2
1.6我似乎不能成功定義一個(gè)鏈表。我試過(guò)typedefstruct{char
*item;NODEPTRnext;}*NODEPTR;但是編譯器報(bào)了錯(cuò)誤信
息。難道在C語(yǔ)言中一個(gè)結(jié)構(gòu)不能包含指向自己的指針嗎?....3
1.7怎樣建立和理解非常復(fù)雜的聲明?例如定義一個(gè)包含N個(gè)指向返
回指向字符的指針的函數(shù)的指針的數(shù)組?......3
1.8函數(shù)只定義了一次,調(diào)用了一次,但編譯器提示非法重定義了。..4
1.9main()的正確定義是什么?voidmai。)正確嗎?...4
1.10對(duì)于沒(méi)有初始化的變量的初始值可以作怎樣的假定?如果一個(gè)
全
局變量初始值為“零”,它可否作為空指針或浮點(diǎn)零?….…4
1.11代碼intf(){chara[]="Hello,world!";}不能編譯。.......5
1.12這樣的初始化有什么問(wèn)題?char*p=malloc(l0);編譯器提示“非
法初始式”云云。.............5
1.13以下的初始化有什么區(qū)別?chara[]="stringliteral";char*p=
''stringliteral";當(dāng)我向p[i]賦值的時(shí)候,我的程序崩潰了。....5
1.14我總算弄清除函數(shù)指針的聲明方法了,但怎樣才能初始化呢?..5
2結(jié)構(gòu)、聯(lián)合和枚舉7
2.1聲明structxl{…}^typedefstruct{...}x2;有什么不同?.7
2.2為什么structx{…};xthestruct;不對(duì)?.....7
2.3一個(gè)結(jié)構(gòu)可以包含指向自己的指針嗎?.....7
2.4在C語(yǔ)言中實(shí)現(xiàn)抽象數(shù)據(jù)類型什么方法最好?...7
2.5在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計(jì)特性的好方法?...7
i
目錄ii
2.6我遇到這樣聲明結(jié)構(gòu)的代碼溫血31到116{intnamelen;char
namestr[l];};然后又使用一些內(nèi)存分配技巧使namestr數(shù)組用起
來(lái)好像有多個(gè)元素。這樣合法和可移植嗎?.....8
2.7是否有自動(dòng)比較結(jié)構(gòu)的方法?........8
2.8如何向接受結(jié)構(gòu)參數(shù)的函數(shù)傳入常數(shù)值?.....8
2.9怎樣從/向數(shù)據(jù)文件讀/寫(xiě)結(jié)構(gòu)?.......9
2.10我的編譯器在結(jié)構(gòu)中留下了空洞,這導(dǎo)致空間浪費(fèi)而且無(wú)法與外
部數(shù)據(jù)文件進(jìn)行“二進(jìn)制”讀寫(xiě)。能否關(guān)掉填充,或者控制結(jié)構(gòu)域
的對(duì)齊方式?..............9
2.11為什么sizeof返回的值大于結(jié)構(gòu)的期望值,是不是尾部有填充?..9
2.12如何確定域在結(jié)構(gòu)中的字節(jié)偏移?......9
2.13怎樣在運(yùn)行時(shí)用名字訪問(wèn)結(jié)構(gòu)中的域?......10
2.14程序運(yùn)行正確,但退出時(shí)卻“coredump”了,怎么回事?.....10
2.15可以初始化一個(gè)聯(lián)合嗎?..........10
2.16枚舉和一組預(yù)處理的#define有什么不同?....10
2.17有什么容易的顯示枚舉值符號(hào)的方法?.....11
3表達(dá)式13
3.1為什么這樣的代碼:a[i]=i++;不能工作?...........13
3.2使用我的編譯器,下面的代碼inti=7;printf("%d\n",i++*i++);
返回49?不管按什么順序計(jì)算,難道不該打印出56嗎?.....13
3.3對(duì)于代碼門(mén)宜=3;14++;不同編譯器給出不同的結(jié)果,有的為
3,有的為4,哪個(gè)是正確的?....................14
3.4這是個(gè)巧妙的表達(dá)式:M=父=/=b它不需要臨時(shí)變量就可
以交換a和b的值。........................14
3.5我可否用括號(hào)來(lái)強(qiáng)制執(zhí)行我所需要的計(jì)算順序?..........14
3.6可是&&和||運(yùn)算符呢?我看到過(guò)類似while((c=getchar())!=
E0F&&c!='\鼠)的代碼…….................14
3.7我怎樣才能理解復(fù)雜表達(dá)式?“序列點(diǎn)”是什么?........15
3.8那么,對(duì)于a[i]=i++;我們不知道a[]的哪一個(gè)分量會(huì)被改寫(xiě),但i
的確會(huì)增加1,對(duì)嗎?.........................15
3.9++i和i++有什么區(qū)別?.....................15
3.10如果我不使用表達(dá)式的值,我應(yīng)該用++i或i++來(lái)自增一個(gè)變量
嗎?..................................15
3.11為什么如下的代碼inta=100,b=100;longintc=a*b;不能
工作?.................................15
3.12我需要根據(jù)條件把一個(gè)復(fù)雜的表達(dá)式賦值給兩個(gè)變量中的一
個(gè)。可以用下邊這樣的代碼嗎?
((condition)?a:b)=complicatedexpression;..................
16
目錄iii
4指針17
4.1我想聲明一個(gè)指針并為它分配一些空間,但卻不行。這些代碼有
什么問(wèn)題?char*p;*p=malloc(10);................17
4.2*p++自增p還是p所指向的變量?...............17
4.3我有一個(gè)char*型指針正巧指向一些int型變量,我想跳過(guò)它們。
為什么如下的代碼((int*)p)++;不行?.............17
4.4我有個(gè)函數(shù),它應(yīng)該接受并初始化一個(gè)指針voidf(int*ip)
{static
intdummy=5;ip=&dummy;)但是當(dāng)我如下調(diào)用時(shí):int*ip;
f(ip);調(diào)用者的指針卻沒(méi)有任何變化。...............18
4.5我能否用void**指針作為參數(shù),使函數(shù)按引用接受一般指
針?..18
4.6我有一個(gè)函數(shù)externintf(int*);它接受指向int型的指針。我怎
樣用引用方式傳入一個(gè)常數(shù)?下面這樣的調(diào)用f(&5);似乎不行。.18
4.7C有“按引用傳遞”嗎?.....................18
4.8我看到了用指針調(diào)用函數(shù)的不同語(yǔ)法形式。到底怎么回事?...19
4.9我怎樣把一個(gè)int變量轉(zhuǎn)換為char*型?我試了類型轉(zhuǎn)換,但是不
行。..................................19
5空(null)指針21
5.1臭名昭著的空指針到底是什么?..................21
5.2怎樣在程序里獲得一個(gè)空指針?.................21
5.3用縮寫(xiě)的指針比較“if(p)”檢查空指針是否可靠?如果空指針的
內(nèi)
部表達(dá)不是0會(huì)怎么樣?......................22
5.4NULL是什么,它是怎么定義的?.................23
5.5在使用非全零作為空指針內(nèi)部表達(dá)的機(jī)器上,NULL是如何定義
的?.................................23
5.6如果NULL定義成#defineNULL((char*)0)難道不就可以向函
數(shù)傳入不加轉(zhuǎn)換的NULL了嗎?.................23
5.7如果NULL和0作為空指針常數(shù)是等價(jià)的,那我到底該用哪一個(gè)
呢?.................................24
5.8但是如果NULL的值改變了,比如在使用非零內(nèi)部空指針的機(jī)器
上,難道用NULL(而不是0)不是更好嗎?............24
5.9用預(yù)定義宏#deflneNullptr(type)(type*)。幫助創(chuàng)建正確類型的
空指針。...............................24
5.10這有點(diǎn)奇怪。NULL可以確保是0,但空(null)指針卻不一定?..24
5.11為什么有那么多關(guān)于空指針的疑惑?為什么這些問(wèn)題如此經(jīng)常
地
出現(xiàn)?................................25
5.12我很困惑。我就是不能理解這些空指針一類的東西。......25
5.13考慮到有關(guān)空指針的所有這些困惑,難道把要求它們內(nèi)部表達(dá)都
必須為0不是更簡(jiǎn)單嗎?......................26
5.14說(shuō)真的,真有機(jī)器用非零空指針嗎,或者不同類型用不同的表
達(dá)?26
目錄iv
5.15運(yùn)行時(shí)的“空指針賦值”錯(cuò)誤是什么意思?............26
6數(shù)組和指針27
6.1我在一個(gè)源文件中定義了chara[6],在另一個(gè)中聲明了extern
char*a。為什么不行?......................27
6.2可是我聽(tīng)說(shuō)chara□和char*a是一樣的。............27
6.3那么,在C語(yǔ)言中“指針和數(shù)組等價(jià)”到底是什么意思?....28
6.4那么為什么作為函數(shù)形參的數(shù)組和指針申明可以互換
呢?....28
6.5如果你不能給它賦值,那么數(shù)組如何能成為左值呢?.......29
6.6現(xiàn)實(shí)地講,數(shù)組和指針地區(qū)別是什么?..............29
6.7有人跟我講,數(shù)組不過(guò)是常指針。.................29
6.8我遇到一些“搞笑”的代碼,包含5[〃abcdef〃]這樣的“表達(dá)式”。
這為什么是合法的C表達(dá)式呢?.................29
6.9既然數(shù)組引用會(huì)蛻化為指針,如果air是數(shù)組,那么arr和&arr又
有什么區(qū)別呢?...........................30
6.10我如何聲明一個(gè)數(shù)組指針?....................30
6.11我如何在運(yùn)行期設(shè)定數(shù)組的大小?我怎樣才能避免固定大小的
數(shù)
組?.................................30
6.12我如何聲明大小和傳入的數(shù)組一樣的局部數(shù)組?.........30
6.13我該如何動(dòng)態(tài)分配多維數(shù)組?...................31
6.14有個(gè)靈巧的竅門(mén):如果我這樣寫(xiě)intrealarray[10];int*array=
&rea1array[-1];我就可以把"array”當(dāng)作下標(biāo)從1開(kāi)始的數(shù)組。..32
6.15當(dāng)我向一個(gè)接受指針的指針的函數(shù)傳入二維數(shù)組的時(shí)候,編譯器
報(bào)錯(cuò)了。...............................32
6.16我怎樣編寫(xiě)接受編譯時(shí)寬度未知的二維數(shù)組的函數(shù)?......32
6.17我怎樣在函數(shù)參數(shù)傳遞時(shí)混用靜態(tài)和動(dòng)態(tài)多維數(shù)組?......33
6.18當(dāng)數(shù)組是函數(shù)的參數(shù)時(shí),為什么sizeof不能正確報(bào)告數(shù)組的大
???34
7內(nèi)存分配35
7.1為什么這段代碼不行?char*answer;printf(*Typesomething:\
n〃);
gets(answer)jprintf(^Youtyped\"%s\"\n”,answer);......35
7.2我的strcat()不行.我試了
char*sl="Hello,";char*s2="world!”;
char*s3=strcat(si,s2);但是我得到了奇怪的結(jié)果。......35
7.3但是strcat的手冊(cè)頁(yè)說(shuō)它接受兩個(gè)char*型參數(shù)。我怎么知道
(空間)分配的事情呢?.......................36
7.4我剛才試了這樣的代碼char*p;strcpy(p,"abc");而它運(yùn)行正
常?怎么回事?為什么它沒(méi)有崩潰?...............36
7.5一個(gè)指針變量分配多少內(nèi)存?...................36
7.6我有個(gè)函數(shù),本該返回一個(gè)字符串,但當(dāng)它返回調(diào)用者的時(shí)候,返
回串卻是垃圾信息。.........................36
目錄v
7.7那么返回字符串或其它集合的爭(zhēng)取方法是什么呢?.......37
7.8為什么在調(diào)用malloc()時(shí),我得到“警告:整數(shù)賦向指針需要類型
轉(zhuǎn)換”?...............................37
7.9為什么有些代碼小心地把malloc返回的值轉(zhuǎn)換為分配的指針類
型。37
7.10在調(diào)用malloc()的時(shí)候,錯(cuò)誤“不能把void*轉(zhuǎn)換為int*”是什
么意思?..................................37
7.11我見(jiàn)到了這樣的代碼char*p=malloc(strlen(s)+l);strcpy(p,
s);難道不應(yīng)該是malloc((strlen(s)+l)*sizeof(char))?....37
7.12我如何動(dòng)態(tài)分配數(shù)組?.......................38
7.13我聽(tīng)說(shuō)有的操作系統(tǒng)程序使用的時(shí)候才真正分配malloc申請(qǐng)的
內(nèi)
存。這合法嗎?...........................38
7.14我用一行這樣的代碼分配一個(gè)巨大的數(shù)組,用于數(shù)字運(yùn)
算:double
*array=malloc(300*300*sizeof(double));malloc()并沒(méi)有返
回null,但是程序運(yùn)行得有些奇怪,好像改寫(xiě)了某些內(nèi)存,或者
malloc。并沒(méi)有分配我申請(qǐng)的那么多內(nèi)存,云云。........38
7.15我的PC有8兆內(nèi)存。為什么我只能分配640K左右的內(nèi)存?..38
7.16我的程序總是崩潰,顯然在malloc內(nèi)部的某個(gè)地方。但是我看不
出哪里有問(wèn)題。是malloc()有bug嗎?..............38
7.17動(dòng)態(tài)分配的內(nèi)存一旦釋放之后你就不能再使用,是吧?.....38
7.18為什么在調(diào)用free。之后指針沒(méi)有變空?使用(賦值,比較)釋放
之后的指針有多么不安全?....................39
7.19當(dāng)我malloc()為一個(gè)函數(shù)的局部指針?lè)峙鋬?nèi)存時(shí),我還需要用
free。明確的釋放嗎?.......................39
7.20我在分配一些結(jié)構(gòu),它們包含指向其它動(dòng)態(tài)分配的對(duì)象的指針。
我在釋放結(jié)構(gòu)的時(shí)候,還需要釋放每一個(gè)下級(jí)指針嗎?.....39
7.21我必須在程序退出之前釋放分配的所有內(nèi)存嗎?.........40
7.22我有個(gè)程序分配了大量的內(nèi)存,然后又釋放了。但是從操作系統(tǒng)
看,內(nèi)存的占用率卻并沒(méi)有回去。.................40
7.23free()怎么知道有多少字節(jié)需要釋放?..............40
7.24那么我能否查詢malloc包,可分配的最大塊是多大?.....40
7.25向reallocO的第一個(gè)參數(shù)傳入空指針合法嗎?你為什么要這樣
做?40
7.26calloc()和malloc。有什么區(qū)別?利用calloc的零填充功能安
全
嗎?free。可以釋放calloc()分配的內(nèi)存嗎,還是需要一個(gè)
cfree()?40
7.27alloca()是什么?為什么不提倡使用它?.............41
8字符和字符串43
8.1為什么strcat(string,不行?................43
8.2我在檢查一個(gè)字符串是否跟某個(gè)值匹配。為什么這樣不行?char
*string;...if(string=="value"){/*stringmatches“value"*/
…}....................................43
目錄vi
8.3如果我可以寫(xiě)chara[]="Hello,world!";為什么我不能寫(xiě)char
a[14];a=,,Hello,world!;.......................43
8.4我怎么得到對(duì)應(yīng)字符的數(shù)字(字符集)值,或者相反?.....44
8.5我認(rèn)為我的編譯器有問(wèn)題:我注意到sizeofCa')是2而不是1(即,
不是sizeof(char))..............................44
9布爾表達(dá)式和變量45
9.1C語(yǔ)言中布爾值的候選類型是什么?為什么它不是一個(gè)標(biāo)準(zhǔn)類
型?我應(yīng)該用#define或enum定義true和false值嗎?....45
9.2因?yàn)樵贑語(yǔ)言中所有的非零值都被看作“真”,是不是把TRUE定
義為1很危險(xiǎn)?如果某個(gè)內(nèi)置的函數(shù)或關(guān)系操作符“返回”不是1
的其它值怎么辦?.........................45
9.3當(dāng)p是指針時(shí),if(p)是合法的表達(dá)式嗎?...........46
10C預(yù)處理器47
10.1這些機(jī)巧的預(yù)處理宏:#definebegin{ttdefineend}你覺(jué)得怎么
樣?.................................47
10.2怎么寫(xiě)一個(gè)一般用途的宏交換兩個(gè)值?..............47
10.3書(shū)寫(xiě)多語(yǔ)句宏的最好方法是什么?................47
10.4我第一次把一個(gè)程序分成多個(gè)源文件,我不知道該把什么放到.c
文件,把什么放到.h文件。(“.h”到底是什么意思?)......48
10.5一個(gè)頭文件可以包含另一頭文件嗎?...............48
10.6#include<>和#include””有什么區(qū)別?...........48
10.7完整的頭文件搜索規(guī)則是怎樣的?................49
10.8我在文件的第一個(gè)聲明就遇到奇怪的語(yǔ)法錯(cuò)誤,但是看上去沒(méi)什
么問(wèn)題。...............................49
10.9我包含了我使用的庫(kù)函數(shù)的正確頭文件,可是連接器還是說(shuō)它沒(méi)
有定義。...............................49
10.10我在編譯一個(gè)程序,看起來(lái)我好像缺少需要的一個(gè)或多個(gè)頭文
件。誰(shuí)能發(fā)給我一份?........................49
10.11我怎樣構(gòu)造比較字符串的#if預(yù)處理表達(dá)式?..........49
10.12sizeof操作符可以用于俄£預(yù)編譯指令中嗎?...........50
10.13我可以在#include行里使用#ifdef來(lái)定義兩個(gè)不同的東西
嗎?.50
10.14對(duì)typdef的類型定義有沒(méi)有類似物£(^£的東西?........50
10.15我如何用打£表達(dá)式來(lái)判斷機(jī)器是高字節(jié)在前還是低字節(jié)在
前?.50
10.16我得到了一些代碼,里邊有太多的#ifdef。我不想使用預(yù)處理器
把所有的#include和#ifdef都擴(kuò)展開(kāi),有什么辦法只保留一種條
件的代碼呢?.............................50
10.17如何列出所有的預(yù)定義標(biāo)識(shí)符?..................50
目錄vii
10.18我有些舊代碼,試圖用這樣的宏來(lái)構(gòu)造標(biāo)識(shí)符
ftdefinePaste(a,b)
a/**/b但是現(xiàn)在不行了。.....................51
10.19為什么宏#defineTRACE(n)printf(〃TRACE:%d\n〃,n)報(bào)出警
告“用字符串常量代替宏”?它似乎應(yīng)該把TRACE(count);擴(kuò)展
為printf("TRACE:%d\count”,count);..............51
10.20使用#操作符時(shí),我在字符串常量?jī)?nèi)使用宏參數(shù)有問(wèn)題?!?1
10.21我想用預(yù)處理做某件事情,但卻不知道如何下手。........51
10.22怎樣寫(xiě)參數(shù)個(gè)數(shù)可變的宏?....................51
11ANSI/ISO標(biāo)準(zhǔn)C53
11.1什么是“ANSIC標(biāo)準(zhǔn)”?........................53
H.2我如何得到一份標(biāo)準(zhǔn)的副本?....................53
H.3我在哪里可以找到標(biāo)準(zhǔn)的更新?..................54
11.4很多ANSI編譯器在遇到以下代碼時(shí)都會(huì)警告類型不匹配。
externintfunc(float);intfunc(x)floatx;{.............54
H.5能否混用舊式的和新型的函數(shù)語(yǔ)法?...............55
11.6為什么聲明externintf(structx*p);報(bào)出了一個(gè)奇怪的警告信
息“結(jié)構(gòu)x在參數(shù)列表中聲明”?.................55
H.7我不明白為什么我不能象這樣在初始化和數(shù)組維度中使用常量:
constintn=5;inta[n];........................55
11.8既然不能修改字符串常量,為什么不把它們定義為字符常量的數(shù)
組?.................................55
11.9"constchar*p"和"char*constp”有彳可區(qū)另U?.........56
11.10為什么我不能向接受constchar**的函數(shù)傳入char**?....56
11.11怎樣正確聲明main。?.......................56
11.12我能否把main。定義為void,以避免擾人的“main無(wú)返回值”警
告?.................................56
H.13可main。的第三個(gè)參數(shù)envp是怎么回事?...........57
11.14我覺(jué)得把main。聲明為void不會(huì)失敗,因?yàn)槲艺{(diào)用了exit()而
不
是return,況且我的操作系統(tǒng)也忽略了程序的退出/返回狀態(tài)。..57
11.15那么到底會(huì)出什么問(wèn)題?真的有什么系統(tǒng)不支持voidmain()
嗎?57
H.16我一直用的那本書(shū)《熟練傻瓜C語(yǔ)言》總是使用voidmain。.57
11.17從main()中,exit(status)和返回同樣的status真的等價(jià)
嗎?...57
11.18我試圖用ANSI“字符串化”預(yù)處理操作符#向信息中插入符號(hào)
常量的值,但它字符串化的總是宏的名字而不是它的值。?????58
11.19警告信息“warning:macroreplacementwithinastringliteral”
是
什么意思?..............................58
11.20在我用#ifdef去掉的代碼里出現(xiàn)了奇怪的語(yǔ)法錯(cuò)誤。......58
11.21#pragma是什么,有什么用?...................59
11.22"#pragmaonce”是什么意思?我在一些頭文件中看到了它。..59
目錄viii
11.23a[3]="abc";合法嗎?它是什么意思?.............59
11.24為什么我不能對(duì)void*指針進(jìn)行運(yùn)算?.............59
11.25memcpy()和memmove()有什么區(qū)別?.............59
11.26malloc(0)有什么用?返回一個(gè)控指針還是指向0字節(jié)的指
針?.59
H.27為什么ANSI標(biāo)準(zhǔn)規(guī)定了外部標(biāo)示符的長(zhǎng)度和大小寫(xiě)限
制?...60
11.28我的編譯對(duì)最簡(jiǎn)單的測(cè)試程序報(bào)出了一大堆的語(yǔ)法錯(cuò)
誤。....60
11.29為什么有些ASNI/IS0標(biāo)準(zhǔn)庫(kù)函數(shù)未定義?我明明使用的就是
ANSI編譯器。...........................60
11.30誰(shuí)有把舊的C程序轉(zhuǎn)化為ANSIC或相反的工具,或者自動(dòng)生成
原型的工具?............................60
11.31為什么聲稱兼容煦5玷弟1'01)022伯8瓦(;編譯器不能編譯這些
代碼?我知道這些代碼是ANSI的,因?yàn)間cc可以編譯。....60
11.32人們好像有些在意實(shí)現(xiàn)定義(implementation-defin-ed)、未明
確
(unspecified)和無(wú)定義(undefined)行為的區(qū)別。它們的區(qū)別到底
在哪里?...............................61
11.33一個(gè)程序的“合法”,“有效”或“符合”到底是什么意思?....61
11.34我很吃驚,ANSI標(biāo)準(zhǔn)竟然有那么多沒(méi)有定義的東西。標(biāo)準(zhǔn)的唯一
任務(wù)不就是讓這些東西標(biāo)準(zhǔn)化嗎?................61
11.35有人說(shuō)i=i++的行為是未定義的,但是我剛在一個(gè)兼容ANSI的
編譯器上測(cè)試,得到了我希望的結(jié)果。..............62
12標(biāo)準(zhǔn)輸入輸出庫(kù)63
12.1這樣的代碼有什么問(wèn)題?
chare;while((c=getchar())!=EOF)...63
12.2我有個(gè)讀取直到EOF的簡(jiǎn)單程序,但是我如何才能在鍵盤(pán)上輸入
那個(gè)“EOF”呢?..........................63
12.3為什么這些代碼while(!feof(infp))
{fgets(buf,MAXLINE,infp);
fputs(buf,outfp);}把最后一行復(fù)制了兩遍?..........63
12.4我的程序的屏幕提示和中間輸出有時(shí)顯示在屏幕上,尤其是當(dāng)我
用管道向另一個(gè)程序輸出的時(shí)候。................63
12.5我怎樣不等待回車鍵一次輸入一個(gè)字符?............64
12.6我如何在printf的格式串中輸出一個(gè)‘獷?我試過(guò)\%,但是不
行。64
12.7有人告訴我在printf中使用%lf不正確。那么,如果scanf()需要
%lf,怎么可以用在printf()中用%f輸出雙精度數(shù)呢?......64
12.8對(duì)于sizet那樣的類型定義,當(dāng)我不知道它到底是long還是其它
類型的時(shí)候,我應(yīng)該使用什么樣的printf格式呢?........64
12.9我如何用printf實(shí)現(xiàn)可變的域?qū)挾??就是說(shuō),我想在運(yùn)行時(shí)確定
寬度而不是使用%8d?.........................64
12.10如何輸出在千位上用逗號(hào)隔開(kāi)的數(shù)字?金額數(shù)字
呢?......65
12.11為什么scanf("%d”,i)調(diào)用不行?.................65
12.12為什么chars[30];scanf("%s",s);不用&也可以?.......65
目錄ix
12.13為什么這些代碼doubled;scanf("%f",&d);不行?.......65
12.14怎樣在scanf()格式串中指定可變的寬度?.............65
12.15當(dāng)我用“%d\n”調(diào)用scanf從鍵盤(pán)讀取數(shù)字的時(shí)候,好像要多輸
入
一行函數(shù)才返回。.........................65
12.16我用scanf%d讀取一個(gè)數(shù)字,然后再用gets()讀取字符串,但是
編譯器好像跳過(guò)了gets。調(diào)用!..................66
12.17我發(fā)現(xiàn)如果堅(jiān)持檢查返回值以確保用戶輸入的是我期待的數(shù)
值,
則scanf()的使用會(huì)安全很多,但有的時(shí)候好像會(huì)陷入無(wú)限循環(huán)。.66
12.18為什么大家都說(shuō)不要使用scanfO?那我該用什么來(lái)代替
呢?...66
12.19我怎樣才知道對(duì)于任意的sprintf調(diào)用需要多大的目標(biāo)緩沖
區(qū)?怎
樣才能避免sprintf()目標(biāo)緩沖區(qū)溢出?..............66
12.20為什么大家都說(shuō)不要使用gets。?.................67
12.21為什么調(diào)用printf()之后errno內(nèi)有ENOTTY?.........67
12.22fgetops/fsetops和ftell/fseek之間有什么區(qū)別?fgetops。
和fsetops()
到底有什么用處?......................68
12.23如何清除多余的輸入,以防止在下一個(gè)提示符下讀入?
fflush(stdin)
可以嗎?...............................68
12.24既然fflush()不能,那么怎樣才能清除輸入呢?..........68
12.25對(duì)某些路徑文件名調(diào)用fopenO總是失敗。.............68
12.26我想用“r+”打開(kāi)一個(gè)文件,讀出一個(gè)字符串,修改之后再寫(xiě)入,
從
而就地更新一個(gè)文件。可是這樣不行。..............69
12.27怎樣在程序里把stdin或stdout重定向到文件?.........69
12.28一旦使用freopen。之后,怎樣才能恢復(fù)原來(lái)的stdout(或
stdin)?69
12.29怎樣同時(shí)向兩個(gè)地方輸出,如同時(shí)輸出到屏幕和文
件?.....69
12.30怎樣正確的讀取二進(jìn)制文件?我有時(shí)看到0x0a和OxOd混淆了,
而且如果數(shù)據(jù)中包含0x1a的話,我好像會(huì)提前遇到EOF。....70
13庫(kù)函數(shù)71
13.1怎樣把數(shù)字轉(zhuǎn)為字符串(與atoi相反)?有itoa()函數(shù)
嗎?....71
13.2為什么strncpy()不能總在目標(biāo)串放上終止符'\(y?......71
13.3為什么有些版本的toupper。對(duì)大寫(xiě)字符會(huì)有奇怪的反應(yīng)?為什
么有的代碼在調(diào)用toupper()前先調(diào)用tolowerO?.........71
13.4怎樣把字符串分隔成用空白作間隔符的段?怎樣實(shí)現(xiàn)類似傳遞
給
main()的argc和argv?........................72
13.5我需要一些處理正則表達(dá)式或通配符匹配的代碼。.......72
13.6我想用strcmp()作為比較函數(shù),調(diào)用qsort()對(duì)一個(gè)字符串?dāng)?shù)組
排
序,但是不行。...........................72
13.7我想用qsort()對(duì)一個(gè)結(jié)構(gòu)數(shù)組排序。我的比較函數(shù)接受結(jié)構(gòu)指
針,但是編譯器認(rèn)為這個(gè)函數(shù)對(duì)于qsort()是錯(cuò)誤類型。我要怎樣
轉(zhuǎn)換這個(gè)函數(shù)指針才能避免這樣的警告?..............73
目錄x
13.8怎樣對(duì)一個(gè)鏈表排序?........................73
13.9怎樣對(duì)多于內(nèi)存的數(shù)據(jù)排序?....................73
13.10怎樣在C程序中取得當(dāng)前日期或時(shí)間?..............73
13.11我知道庫(kù)函數(shù)localtime()可以把timet轉(zhuǎn)換成結(jié)構(gòu)structtm,
而
ctime()可以把timet轉(zhuǎn)換成為可打印的字符串。怎樣才能進(jìn)行
反向操作,把structtm或一個(gè)字符串轉(zhuǎn)換成timet?......74
13.12怎樣在日期上加N天?怎樣取得兩個(gè)日期的時(shí)間間
隔?.....74
13.13我需要一個(gè)隨機(jī)數(shù)生成器。....................75
13.14怎樣獲得在一定范圍內(nèi)的隨機(jī)數(shù)?................75
13.15每次執(zhí)行程序,rand()都返回相同順序的數(shù)字。.........75
13.16我需要隨機(jī)的真/假值,所以我用直接用rand()%2,可是我得到
交替的0,1,0,1,0……........................76
13.17怎樣產(chǎn)生標(biāo)準(zhǔn)分布或高斯分布的隨機(jī)數(shù)?.............76
13.18我不斷得到庫(kù)函數(shù)未定義錯(cuò)誤,但是我已經(jīng)#inlude了所有用到
的頭文件了。............................77
13.19雖然我在連接時(shí)明確地指定了正確的函數(shù)庫(kù),我還是得到庫(kù)函
數(shù)
未定義錯(cuò)誤。.............................77
13.20連接器說(shuō)end未定義代表什么意思?..............77
13.21我的編譯器提示printf未定義!這怎么可能?...........77
14浮點(diǎn)運(yùn)算79
14.1一個(gè)float變量賦值為3.1時(shí),為什么printf輸出的值為
3.0999999?79
1生2執(zhí)行一些開(kāi)方根運(yùn)算,可是得到一些瘋狂的數(shù)字。........79
14.3做一些簡(jiǎn)單的三角函數(shù)運(yùn)算,也引用了#include<math,h>,可
是
一直得到編譯錯(cuò)誤"undefined:sin"(函數(shù)sin未定義)。.....79
14.4浮點(diǎn)計(jì)算程序表現(xiàn)奇隆,在不同的機(jī)器上給出不同的結(jié)
果。....79
14.5有什么好的方法來(lái)驗(yàn)對(duì)浮點(diǎn)數(shù)在“足夠接近”情況下的等
值?...80
14.6怎樣取整數(shù)?...........................80
14.7為什么C不提供乘幕的運(yùn)算符?.................80
14.8為什么我機(jī)器上的vmath.h>沒(méi)有預(yù)定義常數(shù)MPI?.........80
14.9怎樣測(cè)試正££岫^^以及其它特殊值?..............81
14.10在C中如何很好的實(shí)現(xiàn)復(fù)數(shù)?...................81
14.11我要尋找一些實(shí)現(xiàn)以下功能的程序源代碼:快速傅立葉變換
(FFT)、矩陣算術(shù)(乘法、倒置等函數(shù))、復(fù)數(shù)算術(shù)。......81
14.12TurboC的程序崩潰,顯示錯(cuò)誤為"floatingpointformatsnot
linked”(浮點(diǎn)格式未連接)。....................81
15可變參數(shù)83
15.1為什么調(diào)用printf()前,必須要用#include<
stdio.h>?.....83
目錄xi
15.2為什么%£可以在printf()參數(shù)中,同時(shí)表示float和double?他們
難道不是不同類型嗎?........................83
15.3為什么當(dāng)n為longint,printfn);編譯時(shí)沒(méi)有匹配警告?
我以為ANSI函數(shù)原型可以防止這樣的類型不匹配。......83
15.4怎樣寫(xiě)一個(gè)有可變參數(shù)的函數(shù)?..................83
15.5怎樣寫(xiě)類似printf()的函數(shù),再把參數(shù)轉(zhuǎn)傳給printf()去完成大
部
分工作?...............................85
15.6怎樣寫(xiě)類似scanf()的函數(shù),再把參數(shù)轉(zhuǎn)傳給scanf()去完成大部
分工作?...............................85
15.7怎樣知道實(shí)際上有多少個(gè)參數(shù)傳入函數(shù)?.............85
15.8為什么編譯器不讓我定義一個(gè)沒(méi)有固定參數(shù)項(xiàng)的可變參數(shù)函
數(shù)?.86
15.9我有個(gè)接受float的可變參函數(shù),為什么vaarg(argp,float)不工
作?86
15.10vaarg()不能得到類型為函數(shù)指針的參數(shù)。.............86
15.n怎樣實(shí)現(xiàn)一個(gè)可變參數(shù)函數(shù),它把參數(shù)再傳給另一個(gè)可變參數(shù)
函
數(shù)?.................................86
15.12怎樣調(diào)用一個(gè)參數(shù)在執(zhí)行是才建立的函數(shù)?..........87
16奇怪的問(wèn)題89
16.1遇到不可理解的不合理語(yǔ)法錯(cuò)誤,似乎大段的程序沒(méi)有編
譯。..89
16.2為什么過(guò)程調(diào)用不工作?編譯器似乎直接跳過(guò)去了。......89
16.3程序在執(zhí)行用之前就崩潰了,用調(diào)試器單步跟進(jìn),在main。之前
就死了。...............................89
16.4程序執(zhí)行正確,但退出時(shí)崩潰在main。最后一個(gè)語(yǔ)句之后。為什
么會(huì)這樣?.............................89
16.5程序在一臺(tái)機(jī)器上執(zhí)行完美,但在另一臺(tái)上卻得到怪異的結(jié)果。
更奇怪的是,增加或去除調(diào)試的打印語(yǔ)句,就改變了癥狀……...90
16.6為什么代碼:char*p="hello,worl!";p[0]='H';會(huì)崩潰?...90
16.7"Segmentationviolation","Buserror”和
“Generalprotectionfault”
意味著什么?............................91
17風(fēng)格93
17.1什么是C最好的代碼布局風(fēng)格?.................93
17.2用if(!strcmp(si,s2))比較兩個(gè)字符串等值,是否是個(gè)好風(fēng)
格?…93
17.3為什么有的人用if(0==x)而不是if(x==0)?.........93
17.4原型說(shuō)明externintfunc((int,int));中,那些多出來(lái)的括號(hào)和
下
劃線代表了什么?.........................94
17.5為什么有些代碼在每次調(diào)用printf()前,加了類型轉(zhuǎn)換
(void)?..94
17.6什么是“匈牙利標(biāo)志法”(HungarianNotation)?是否值得
用?..94
17.7哪里可以找到“印第安山風(fēng)格指南”(IndianHillStyleGuide)
及
其它編碼標(biāo)準(zhǔn)?...........................94
目錄xii
17.8有些人說(shuō)goto是邪惡的,我應(yīng)該永不用它。那是否太極端
T?..95
18工具和資源97
18.1常用工具列表。..........................97
18.2怎樣抓捕棘手的11^110(:問(wèn)題?...................98
18.3有什么免費(fèi)或便宜的編譯器可以使用?..............98
18.4剛剛輸入完一個(gè)程序,但它表現(xiàn)的很奇怪。你可以發(fā)現(xiàn)有什么錯(cuò)
誤的地方嗎?............................98
18.5哪里可以找到兼容ANSI的lint?...................99
18.6難道ANSI函數(shù)原型說(shuō)明沒(méi)有使lint過(guò)時(shí)嗎?..........99
18.7網(wǎng)上有哪些C的教程或其它資源?................99
18.8哪里可以找到好的源代碼實(shí)例,以供研究和學(xué)習(xí)?........100
18.9有什么好的學(xué)習(xí)C的書(shū)?有哪些高級(jí)的書(shū)和參考?.......100
18.10哪里可以找到標(biāo)準(zhǔn)C函數(shù)庫(kù)的源代碼?...............101
18.11是否有一個(gè)在線的C參考指南?..................101
18.12哪里可以得到ANSI/IS0C標(biāo)準(zhǔn)?.................101
18.13我需要分析和評(píng)估表達(dá)式的代碼。.................101
18.14哪里可以找到C的BNF或YACC語(yǔ)法?.............101
18.15誰(shuí)有C編譯器的測(cè)試套件?.....................102
18.16哪里有一些有用的源代碼片段和例子的收集?...........102
18.17我需要執(zhí)行多精度算術(shù)的代碼。..................102
18.18在哪里和怎樣取得這些可自由發(fā)布的程序?...........102
19系統(tǒng)依賴105
19.1怎樣從鍵盤(pán)直接讀入字符而不用等RETURN鍵?怎樣防止字符
輸入時(shí)的回顯?...........................105
19.2怎樣知道有未讀的字符,如果有,有多少?如果沒(méi)有字符,怎樣使
讀入不阻斷?.............................106
19.3怎樣顯示一個(gè)百分比或“轉(zhuǎn)動(dòng)的短棒”的進(jìn)展表示器?....106
19.4怎樣清屏?怎樣輸出彩色文本?怎樣移動(dòng)光標(biāo)到指定位
置?...106
19.5怎樣讀入方向鍵,功能鍵?....................107
19.6怎樣讀入鼠標(biāo)輸入?.......................107
19.7怎樣做串口(“comm”)的輸入輸出?...............107
19.8怎樣直接輸出到打印機(jī)?......................107
19.9怎樣發(fā)送控制終端或其它設(shè)備的逃逸指令序列?.........108
19.10怎樣直接訪問(wèn)輸入輸出板?....................108
19.11怎樣做圖形?.............................108
19.12怎樣顯示GIF和JPEG圖象?...................108
19.13怎樣檢驗(yàn)一個(gè)文件是否存在?...................108
19.14怎樣在讀入文件前,知道文件大???................109
目錄xiii
19.15怎樣得到文件的修改日期和時(shí)間?................109
19.16怎樣縮短一個(gè)文件而不用清除或重寫(xiě)?..............109
19.17怎樣在文件中插入或刪除一行(或記錄)?..............109
19.18怎樣從一個(gè)打開(kāi)的流或文件描述符得到文件
名?.........110
19.19怎樣刪除一個(gè)文件?.........................110
19.20怎樣復(fù)制一個(gè)文件?.........................110
19.21為什么用了詳盡的路徑還不能打開(kāi)文件?fopen("c:\newdir
\file.dat","r")返回錯(cuò)誤。......................110
19.22fopen()不讓我打開(kāi)文件:〃$HOME/.profile"和"
/.myrcfile*o.Ill
19.23怎樣制止MS-DOS下令人擔(dān)憂的“Abort,Retry,Ignore?”信息?
111
19.24避Ij“ToomanyopenfHes(打開(kāi)文件太多)”的錯(cuò)誤,怎樣增加同
時(shí)打開(kāi)文件的允許數(shù)目?......................111
19.25怎樣在C中讀入目錄?........................111
19.26怎樣找出系統(tǒng)還有多少內(nèi)存可用?.................111
19.27怎樣分配大于64K的數(shù)組或結(jié)構(gòu)?.................111
19.28錯(cuò)誤信息“DGROUPdataallocationexceeds64K(DGROUP數(shù)
據(jù)分配內(nèi)存超過(guò)64K)”說(shuō)明什么?我應(yīng)該怎么做?我以為使用了
大內(nèi)存模型,那我就可以使用多于64K的數(shù)據(jù)!..........112
19.29怎樣訪問(wèn)位于某的特定地址的內(nèi)存(內(nèi)存映射的設(shè)備或圖顯內(nèi)
存)?112
19.30怎樣在一個(gè)C程序中調(diào)用另一個(gè)程序(獨(dú)立可執(zhí)行的程序,或系
統(tǒng)
命令)?................................112
19.31怎樣調(diào)用另一個(gè)程序或命令,同時(shí)收集它的輸
出?.........113
19.32怎樣才能發(fā)現(xiàn)程序自己的執(zhí)行文件的全路徑?..........113
19.33怎樣找出和執(zhí)行文件在同一目錄的配置文件?..........113
19.34一個(gè)進(jìn)程如何改變它的調(diào)用者的環(huán)境變量?...........113
19.35怎樣讀入一個(gè)對(duì)象文件并跳躍到其中的地址?..........114
19.36怎樣實(shí)現(xiàn)精度小于秒的延時(shí)或記錄用戶回應(yīng)的時(shí)
間?......114
19.37怎樣抓獲或忽略像control-C這樣的鍵盤(pán)中斷?..........114
19.38怎樣很好地處理浮點(diǎn)異常?.....................115
19.39怎樣使用socket?網(wǎng)絡(luò)化?寫(xiě)客戶/服務(wù)器程
序?........115
19.40怎樣調(diào)用BIOS函數(shù)?寫(xiě)ISR?創(chuàng)建TSR?.............115
19.41編譯程序,編譯器出示“unionREGS”未定義錯(cuò)誤信息,連接器出
示“int86()”的未定義錯(cuò)誤信息。..................115
19.42什么是“near”和“far”指針?...................116
19.43我不能使用這些非標(biāo)準(zhǔn)、依賴系統(tǒng)的函數(shù),程序需要兼容
ANSI!.116
20雜項(xiàng)117
20.1怎樣從一個(gè)函數(shù)返回多個(gè)值?....................117
20.2怎樣訪問(wèn)命令行參數(shù)?.......................117
目錄xiv
20.3怎樣寫(xiě)數(shù)據(jù)文件,使之可以在不同字大小、字節(jié)順序或浮點(diǎn)格式
的機(jī)器上讀入?............................117
20.4怎樣調(diào)用一個(gè)由char*指針指向函數(shù)名的函數(shù)?.......117
20.5怎樣實(shí)現(xiàn)比特?cái)?shù)組或集合?....................118
20.6怎樣判斷機(jī)器的字節(jié)順序是高字節(jié)在前還是低字節(jié)在
前?……118
20.7怎樣掉換字節(jié)?...........................118
20.8怎樣轉(zhuǎn)換整數(shù)到二進(jìn)制或十六進(jìn)制?..............119
20.9我可以使用二進(jìn)制常數(shù)嗎?有printf()的二進(jìn)制的格式符
嗎?..119
20.10什么是計(jì)算整數(shù)中比特為1的個(gè)數(shù)的最有效的方
法?......119
20.11什么是提高程序效率的最好方法?.................119
20.12指針真得比數(shù)組快嗎?函數(shù)調(diào)用會(huì)拖慢程序多少?++i比i=i
+1快嗎?...............................120
20.13人們說(shuō)編譯器優(yōu)化的很好,我們不在需要為速度而寫(xiě)匯編了,但
我
的編譯器連用移位代替i/=2都做不到。.............120
20.14怎樣不用臨時(shí)變量而交換兩個(gè)值?.................120
20.15是否有根據(jù)字符串做切換的方法?.................121
20.16是否有使用非常量case標(biāo)志的方法(例如范圍或任意的表達(dá)
式)?121
20.17return語(yǔ)句外層的括號(hào)是否真的可選擇?..............121
20.18為什么C注釋不能嵌套?怎樣注釋掉含有注釋的代碼?引用字
符
串內(nèi)的注釋是否合法?........................121
20.19C是個(gè)偉大的語(yǔ)言還是別的?哪個(gè)其它語(yǔ)言可以寫(xiě)象a+++++b
這樣的代碼?.............................122
20.20為什么C沒(méi)有嵌套函數(shù)?.....................122
20.21assert()是什么?怎樣用它?.....................122
20.22怎樣從C中調(diào)用FORTRAN(C++,BASIC,Pascal,Ada,LISP)
的函數(shù)?反之亦然?.........................122
20.23有什么程序可以做從Pascal或Fortran(或LISP,Ada,awk,“老”
C)至IJC的轉(zhuǎn)換?..........................123
20.24C++是C的超集嗎?可以用C++編譯器來(lái)編譯C代碼嗎?..123
20.25需要用到“近似”的strcmp,比較兩個(gè)字符串的近似度,并不需
要
完全一樣。.............................123
20.26什么是散列法?............................124
20.27由一個(gè)日期,怎樣知道是星期兒?.................124
20.28(year%4==0)是否足夠判斷潤(rùn)年?2000年是閏年嗎?.....124
20.29一個(gè)難題:怎樣寫(xiě)一個(gè)輸出自己源代碼的程序?.........124
20.30什么是“達(dá)夫設(shè)備”(Duff'sDevice)?.................125
20.31下屆國(guó)際C混亂代碼競(jìng)賽Q0CCC)什么時(shí)候進(jìn)行?哪里可以找
到當(dāng)前和以前的獲勝代碼?.....................125
20.32[K&R1]提到的關(guān)健字entry是什么?...............126
目錄XV
20.33c的名字從何而來(lái)?.........................126
20.34“char”如何發(fā)音?.........................126
20.35“l(fā)value”和“rvalue”代表什么意思?................126
20.36哪里可以取得本FAQ(英文版)的額外副本?..........126
21感謝129
文獻(xiàn)131
目錄xvi
、/▲、▲
刖H
本文從英文C-FAQ(2004年7月3日修訂版)翻譯而來(lái)。本文的中文版權(quán)
為
朱群英和孫云所有。本文的內(nèi)容可以自由用于個(gè)人目的,但是不可以
未經(jīng)許可出
版發(fā)行。英文版權(quán)為SteveSummit所有,詳情見(jiàn)下面的英文版權(quán)說(shuō)明。
TheEnglishversionofthisFAQlistisCopyrightl990-2004bySteveSu
mmit.
Contentfromthebook
(CProgrammingFAQs:FrequentlyAskedQuestions^is
madeavailableherebypermissionoftheauthorandthepublisherasas
erviceto
thecommunity.Itisintendedtocomplementtheuseofthepublishedte
xtandis
protectedbyinternationalcopyrightlaws.Theon-linecontentmayb
eaccessed
freelyforpersonalusebutmaynotberepublishedwithoutpermission
最新的HTML中譯版本可以在http:〃c-faq-chn.sourceforge,net/取
得。
另外在同一地址還提供PDF版本的下載。在
http://sourceforge,net/projects/
c-faq-chn可以得到本文的LATEX源文件。
有關(guān)英文原文的問(wèn)題,請(qǐng)咨詢SteveSummit(scs@)。有關(guān)
中文譯
稿的問(wèn)題,請(qǐng)聯(lián)系孫云(sunyun.s@,1T2章)和朱群英
(zhu.qunying?
,13-20章、LATEX文件編輯)。
xvii
第1章
聲明和初始化
1.1我如何決定使用那種整數(shù)類型?
如果需要大數(shù)值(大于32,767或小于-32,767),使用long型。否則,
如果空
間很重要(如有大數(shù)組或很多結(jié)構(gòu)),使用short型。除此之外,就使用
int型。如
果嚴(yán)格定義的溢出特征很重要而負(fù)值無(wú)關(guān)緊要,或者你希望在操作二
進(jìn)制位和字
節(jié)時(shí)避免符號(hào)擴(kuò)展的問(wèn)題,請(qǐng)使用對(duì)應(yīng)的無(wú)符號(hào)類型。但是,要注意在
表達(dá)式中混
用有符號(hào)和無(wú)符號(hào)值的情況。
盡管字符類型(尤其是無(wú)符號(hào)字符型)可以當(dāng)成“小”整型使用,但由
于不可預(yù)
知的符號(hào)擴(kuò)展和代碼增大有時(shí)這樣做可能得不償失。使用無(wú)符號(hào)字符
型有所幫助;
類似的問(wèn)題參見(jiàn)問(wèn)題12.1。
在選擇浮點(diǎn)型和雙精度浮點(diǎn)型時(shí)也有類似的權(quán)衡。但如果一個(gè)變量的
指針必
須為特定的類型時(shí),以上規(guī)則不再適用。
如果因?yàn)槟撤N原因你需要聲明一個(gè)有嚴(yán)格大小的變量,確保象C99的
<inttypes.
h>那樣用某種適當(dāng)?shù)膖ypedef封裝這種選擇。通常,這樣做唯一的好
原因是
試圖符合某種外部強(qiáng)加的存儲(chǔ)方案,請(qǐng)參見(jiàn)問(wèn)題20.3o
如果你需要操作超過(guò)C的內(nèi)置類型支持的超大變量,請(qǐng)參見(jiàn)問(wèn)題
18.170
參考資料:[K&R1,Sec.2.2p.34];[K&R2,Sec.2.2p.36,Sec.A4.2pp.
195-6,Sec.BlIp.257];[ISO,Sec..1,Sec.];[H&S,Se
cs.5.1,5.2pp.
110-114]o
1.264位機(jī)上的64位類型是什么樣的?
C99標(biāo)準(zhǔn)定義了longlong類型,其長(zhǎng)度可以保證至少64位,這種類型在
某些
編譯器上實(shí)現(xiàn)已經(jīng)頗有時(shí)日了。其它的編譯器則實(shí)現(xiàn)了類似longlong
的擴(kuò)展。
另一方面,也可以實(shí)現(xiàn)16位的短整型、32位的整型和64位的長(zhǎng)整型,
有些編譯器
正是這樣做的。
參見(jiàn)問(wèn)題18.17。
參考資料:[C9X,Sec..1,Sec.]
1
第1章聲明和初始化2
1.3怎樣定義和聲明全局變量和函數(shù)最好?
首先,盡管一個(gè)全局變量或函數(shù)可以(在多個(gè)編譯單元中)有多處“聲
明”,但
是“定義”卻只能允許出現(xiàn)一次。定義是分配空間并賦初值(如果有)
的聲明。最
好的安排是在某個(gè)相關(guān)的.c文件中定義,然后在頭文件(?h)中進(jìn)行外
部聲明,在需
要使用的時(shí)候,只要包含對(duì)應(yīng)的頭文件即可。定義變量的.c文件也應(yīng)
該包含該頭
文件,以便編譯器檢查定義和聲明的一致性。
這條規(guī)則提供了高度的可移植性:它和ANSIC標(biāo)準(zhǔn)一致,同時(shí)也兼容大
多
數(shù)ANSI前的編譯器和連接器。Unix編譯器和連接器通常使用“通用模
式”允許
多重定義,只要保證最多對(duì)一處進(jìn)行初始化就可以了;ANSIC標(biāo)準(zhǔn)稱這
種行為為
“公共擴(kuò)展”,沒(méi)有語(yǔ)帶雙關(guān)的意思。
可以使用預(yù)處理技巧來(lái)使類似
DEFINE(int,i);
的語(yǔ)句在一個(gè)頭文件中只出現(xiàn)一次,然后根據(jù)某個(gè)宏的設(shè)定在需要的
時(shí)候轉(zhuǎn)
化成定義或聲明。但不清楚這樣的麻煩是否值得。
如果希望讓編譯器檢查聲明的一致性,一定要把全局聲明放到頭文件
中。特
別是,永遠(yuǎn)不要把外部函數(shù)的原型放到.c文件中:通常它與定義的一
致性不能得
到檢查,而矛盾的原型比不用還糟糕。
參見(jiàn)問(wèn)題10.4和18.6。
參考資
料:[K&R1,Sec.4.5pp.76-7];[K&R2,Sec.4.4pp.80-1];[ISO,Sec.
,Sec.6.7,Sec.6.7.2,Sec.G.5.11];[Rationale,Sec.3.1.2.
2];[H&S,Sec.4.8
pp.101-104,Sec.9.2.3p.267];[CT&P,Sec.4.2pp.54-56].
1.4extem在函數(shù)聲明中是什么意思?
它可以用作一種格式上的提示表明函數(shù)的定義可能在另一個(gè)源文件
中,但在
externintf();
和
intf();
之間并沒(méi)有實(shí)質(zhì)的區(qū)別。
參考資
料:[ISO,Sec.,Sec.6.5.1];[Rationale,Sec.];[H&S
Secs.4.3,4.3.1pp.75-6].
1.5關(guān)鍵字auto到底有什么用途?
毫無(wú)用途;它已經(jīng)過(guò)時(shí)。參見(jiàn)問(wèn)題20.32。
參考資
W-:[K&R1,Sec.A8.Ip.193];[ISO,Sec.,Sec.6.5.1;];[H&S,
Sec.4.3p.75,Sec.4.3.Ip.76].
第1章聲明和初始化3
1.6我似乎不能成功定義一個(gè)鏈表。我試過(guò)typedefstruct{char
*item;NODEPTRnext;}*NODEPTR;但是編譯器報(bào)了錯(cuò)誤
信息。難道在C語(yǔ)言中一個(gè)結(jié)構(gòu)不能包含指向自己的指針嗎?
C語(yǔ)言中的結(jié)構(gòu)當(dāng)然可以包含指向自己的指針;[K&R2,第6.5節(jié)]的討
論和
例子表明了這點(diǎn)。NODEPTR例子的問(wèn)題是在聲明next域的時(shí)候typedef
還沒(méi)
有定義。為了解決這個(gè)問(wèn)題,首先賦予這個(gè)結(jié)構(gòu)一個(gè)標(biāo)簽
("structnode")。然后,
聲明"ne
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 期貨市場(chǎng)品牌建設(shè)與維護(hù)服務(wù)考核試卷
- 木材加工行業(yè)人才培養(yǎng)計(jì)劃考核試卷
- 攝影器材行業(yè)市場(chǎng)動(dòng)態(tài)監(jiān)測(cè)與競(jìng)爭(zhēng)情報(bào)分析考核試卷
- 辦公室員工職業(yè)發(fā)展與培訓(xùn)體系建設(shè)案例考核試卷
- 天然氣開(kāi)采項(xiàng)目財(cái)務(wù)管理與成本控制考核試卷
- 固體飲料的無(wú)添加與天然成分趨勢(shì)考核試卷
- 木材貿(mào)易風(fēng)險(xiǎn)管理與防范考核試卷
- 搪瓷衛(wèi)生潔具的顧客滿意度調(diào)查考核試卷
- 放射性金屬礦選礦實(shí)驗(yàn)方法與技術(shù)考核試卷
- 鋼板出售轉(zhuǎn)讓合同范本
- 統(tǒng)編版高中政治必修3必背主觀題
- 保管錢(qián)財(cái)協(xié)議書(shū)的范本
- 供電所安全第一課培訓(xùn)
- 湖北省武漢市二月調(diào)考讀后續(xù)寫(xiě)解析+課件
- 鄭州鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 岳陽(yáng)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試參考試題庫(kù)(含答案)
- 部編人教版六年級(jí)道德與法治下冊(cè)第7課《多元文化 多樣魅力》教學(xué)設(shè)計(jì)
- 新時(shí)代勞動(dòng)教育教程(高職)大學(xué)生勞動(dòng)教育全套教學(xué)課件
- 2023年開(kāi)展的課外讀物負(fù)面清單管理的具體措施
- 《國(guó)防動(dòng)員實(shí)施》課件
- 上高雙胞胎弘安畜牧有限公司田心鎮(zhèn)現(xiàn)代化18萬(wàn)出欄育肥場(chǎng)建設(shè)項(xiàng)目環(huán)評(píng)報(bào)告
評(píng)論
0/150
提交評(píng)論