2011年計算機等級考試二級C語言常見問題_第1頁
2011年計算機等級考試二級C語言常見問題_第2頁
2011年計算機等級考試二級C語言常見問題_第3頁
2011年計算機等級考試二級C語言常見問題_第4頁
已閱讀5頁,還剩114頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2011年計算機等級考試二級C語言常見問題(1)第1章聲明和初始化問題:我如何決定使用那種整數(shù)類型?64位機上的64位類型是什么樣的?怎樣定義和聲明全局變量和函數(shù)最好?extern在函數(shù)聲明中是什么意思?關(guān)鍵字auto到底有什么用途?我似乎不能成功定義ー個鏈表。我試過typedefstruct{char*item;NODEPTRnext;}*NODEPTR;但是編譯器報了錯誤信息。難道在C語言中一個結(jié)構(gòu)不能包含指向自己的指針嗎?怎樣建立相理解非常復雜的聲明?例如定義ー個包含N個指向返回指向字符的指針的函數(shù)的指針的數(shù)組?函數(shù)只定義了一次,調(diào)用了一次,但編譯器提示非法亜定義了。main()的正確定義是什么?voidmain()正確嗎?對于沒有初始化的變量的初始值可以作怎樣的假定?如果一個全局變量初始值為“零”,它可否作為空指針或浮點零?代碼intf(){chara[]="Hello,world!";)不能編譯。這樣的初始化有什么問題?char*p=malloc(lO);編譯器提示“非法初始式‘‘云云。以下的初始化有什么區(qū)別?chara[]="stringliteral";char*p="stringliteral";當我向p[i]賦值的時候,我的程序崩潰了。我總算弄清除函數(shù)指針的聲明方法了,但怎樣才能初始化呢?第1章聲明和初始化我如何決定使用那種整數(shù)類型?如果需要大數(shù)值(大于32,767或小于ー32,767),使用long型.否則,如果空間很重要(如有大數(shù)組或很多結(jié)構(gòu)),使用short型.除此之外,就使用int型?如果嚴格定義的溢出特征很単要而負值無關(guān)緊要,或者你希望在操作二進制位和字節(jié)時避免符號擴展的問題,請使用對應(yīng)的無符號類型。但是,要注意在表達式中混用有符號和無符號值的情況。盡管字符類型(尤其是無符號字符型)可以當成“小”整型使用,但由于不可預知的符號擴展和代碼增大有時這樣做可能得不償失。使用無符號字符型有所幫助;類似的問題參見問題12.1.在選擇浮點型和雙精度浮點型時也有類似的權(quán)衡。但如果?個變量的指針必須為特定的類型時,以上規(guī)則不再適用.如果因為某種愫因你需要聲明?個有嚴格大小的變質(zhì),確保象C99的<int-types.h>那樣用某種適當?shù)膖ypedef封裝這種選擇。通常,這樣做唯?的好原因足試圖符合某種外部強加的存儲方案,請參見同題20.3。如果你需要操作超過C的內(nèi)置類型支持的超大變量,請參見問題!8.17.參考資料:[K<kRl,Sec.2.2p.34];[K&R2,Sec.2.2p.36,Sec.A4.2pp.195-6,Sec.Bllp.257];[ISO,Sec..1,Sec.6.125];[H&S,Secs.5.1,5.2pp.110-114].64位機上的64位類型是什么樣的?C99標準定義了!onglong類型,其長度可以保證至少64位,這種類型在某些編譯器上實現(xiàn)己經(jīng)頗有時口了.其它的編譯器則實現(xiàn)了類似」onglong的擴展。另ー方面,也可以實現(xiàn)16位的短整型、32位的整型和64位的長整型,有些編譯器正是這樣做的.參見問題!8.17.參考資料:[C9X,Sec..1,Sec.]怎樣定義和聲明全局變量和函數(shù)最好?首先,盡管個全局變量或函數(shù)可以(在多個編譯單元中)有多處“聲明”,但是“定義”卻只能允許出現(xiàn)一次?定義是分配空間并賦初值(如果有)的聲明.最好的安排是在某個相關(guān)的.c文件中定義,然后在頭文件(.h)中進行外部聲明,在需要使用的時候,只要包含對應(yīng)的頭文件即可。定義變量的.c文件也應(yīng)該包含該頭文件,以便編譯器檢査定義和聲明的一致性.這條規(guī)則提供了髙度的可移植性:它和ANSIC標潴?致,同時也兼容大多數(shù)ANSI前的編譯器和連接器.Unix編譯器和連接器通常使用“通用模式”允許多車定義,只要保證最多對ー處進行初始化就可以了;ANSIC標準稱這種行為為“公共擴展<',沒有語帶雙關(guān)的意思.可以使用懂處理技巧來使類似DEFINE(int,1);的語句在ー個頭文件中只出現(xiàn)一次,然后根據(jù)某個宏的設(shè)定在需要的時候轉(zhuǎn)化成定義或聲明。但不潔楚這樣的麻煩是否值得.如果希望讓編譯器檢査聲明的一致性,一定要把全局聲明放到頭文件中?特別是,永遠不要把外部函數(shù)的原型放到.C文件中:通常它與定義的一致性不能得到檢査,而矛盾的原型比不用還槽桂。參見問題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,];[H&S,Sec.4.8pp.101-104,Sec.9.2.3p.267];[CT&P,Sec.4.2pp.54-56].它可以用作?種格式上的提示表明函數(shù)的定義可能在另一個源文件中,但在externint1();和intf0;之間并沒有實質(zhì)的區(qū)別.參考資料:[ISO,Sec.6.1.2.2,Sec.6.5,1];[Rationale,Sec.3.1.2.2];[H&S,Secs..1pp.75-6].關(guān)鍵字auto到底有什么用途?亳無用途:它已經(jīng)過時。參見問題20.32.參考資料:(K&R1,Sec.A8.1p.193];[ISO,Sec.,Sec.6.5.1;];[H&S,Sec.4.3p.75,Sec.4.3.1p.76].我似乎不能成功定義ー個鮭表°我試過ty]M'イ「f{char+it<iu:NODEPTRurxt:}"NODEPIR:但是編徑器報了錯誤信目。難道在〇喏言中一個結(jié)構(gòu)不能包含指冋自己的指針嗎?C厝,屮口叫構(gòu)節(jié)セnJ以包"#II由i:P&R2, 6.51]二淪卬例デ3;明了達デ,NODEPTR化:-的間匙[/[二?]next:戔的時バ(ypedef"設(shè)育ホムキ了解決這外網(wǎng)取?先Mアナ個拈構(gòu)?。林《rstructnode")"]二,HWFext"或為-structnode或『I開typedef定義行”構(gòu)定《.此?㈣吝/桑納以ド上個修設(shè)后的成心structnode{char?ltem;structnode*next;);typedefstructnode?NODEPTR;.少汪白‘種‘,"fI-的方リ.解,;、は1、リ親仁一typedef疋義"相弓!用的曲カ結(jié)構(gòu)時也—とマ的同子,可以冃同徉的方法解決.冬見同虺2.1¥り資料:[K&R1.Sec.G.5p,101][K&R2.Sec.6.5p,139];[ISO.Sec.6.5.2,Sec6.523]:[H'S,Sec5.61pp.132-3]怎樣建立和理解非常復雜的聲明?例如定義ー個包含N個指向返回指向字符的指針的茁數(shù)的指針的數(shù)組?退個問ぐ至少有以ト3種右案:-char?(?(aa[N])())();.用typedef菱し,;或聲明:typedefchar*pc;/?寸苻指針?/typedeipcipc();ハヒけ苻指針的隕數(shù)*/rypedetfpc*pfpc;/? 而函數(shù)的指よ?/typedefpipefpfpcO;/?返冋陋數(shù)描針的味數(shù)?/typedeifpfpc?pfptpc;ハル畫數(shù)的指針?/pfpfpca[N];/? お指計的數(shù)組?/.使用cdeclMア,它可K把英文翻譯成C或并把C取譯成貝文:cdecl>declareaasarrayofpointertofunctionreturningpointertofunctionreturningpointertocharchar?(?(?a[])0)0通過類型轉(zhuǎn)換,cdec!也可以用「解擇復雜的聲叨,指出t數(shù)應(yīng)該進入哪?對括號(如同位!述的復雜函數(shù)定義Iり.一見何懸!81木好的C語言書都會解釋如何“從內(nèi)到外”解釋和理解這樣復雜的C語;聲明(“模擬聲明使用")。|二文的例子中的函數(shù)指針聲明還沒4包括參數(shù)類型信息。如果參數(shù)行復雜類型,聲明就會變得真正的混亂了。現(xiàn)代的cdecl版木可以提供幫助.參考資料:[K&R2,Sec.5.12p.122];[ISO,Sec.6.5ff(esp.Sec.654)];[H助S,Sec.4.5pp.85-92.Sec.5.10.1pp.149-50]函數(shù)只定義了一次.調(diào)用了一次.但編譯器提示非法重定義了。在范用內(nèi)沒行聲明就調(diào)用(可能是第?次調(diào)用在函數(shù)的定義之前)的函數(shù)般認為返回整型(迎)(且沒有任何參數(shù)類弐息),如果函數(shù)在后邊聲明或定義成其它類型就會導致矛盾.所。函數(shù)(非整型函數(shù)定変)必須在調(diào)用之前聲明。另ー個可能的原因是該函數(shù)」某個頭文件中聲明的カ?個函數(shù)同名。參見問題11.4和15.1參考資料:[K&Rl,Sec.4.2p.70]:[K\rR2.Sec.4.2p.72];[ISO.Sec.G.3.2.2];[H&S,Sec.4.7p.101].inain()的正確定義是什么?voidinain()正確嗎?參見問題!1.11到11.16.(這樣的定義不正確).代碼inff(){<li;n;?[]="H<llo.world!":}不能編譯〇??依,E用的史ANSI之而的端ぐ國,小イ、匕手"as(automaticaggregates.miIIぬ態(tài)左ス;數(shù)如、/構(gòu)和郎言)的例始化V見向庭11.28這樣的初始化有什么問題?<h:ir?卩=inallo<(10):編怪器受示??非法初始式“云云?!?,:」.’い「スナ,;」:,,,.一,“一 '.,'I.靜志克斌)的樹始式中以下的初始化有'什么區(qū)別?《hnr"°="stringIit?'ral":char+p="stringliteral":當我向p[i]賦值的時候.我的程序麗潰ア〇<'I-'1-I!,l< 「川衆(zhòng)河”’歩さ「小,”chara。!;中),它指明該數(shù)組I「『パ的何始值其它怙,兄ド,ピ會轉(zhuǎn)化為卜無名的的.*7.「「「ー’;工,ミレンユ?_iL屮,數(shù)組邇常被;,間轉(zhuǎn)化為1、指針("見第G韋),內(nèi)ル決や亡此三p初始化成指向無名數(shù)的21、市4\為r竭-in代碼.ズ的編譯ーム —t一3可可的卄イ?見間題1」1、6.1、6.2K16.6.”.:t-v:rl[K<!cR2,Sec55p104]:[ISO.Sec.G.l4.Sec.6.5,7].[Rationale.See.3.14]:[H&S,Sec.2.7.4pp31-2]201I年計算機等級考試二級C語言常見問題(2)第2章結(jié)構(gòu)、聯(lián)合和枚舉問題列表聲明structxl{...};和typedefstruct{...}x2;有什么不同?為什么structx{...);xthestruct:不對?ー個結(jié)構(gòu)可以包含指向自己的指針嗎?在C語言中實現(xiàn)抽象數(shù)據(jù)類型什么方法最好?在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計特性的好方法?我遇到這樣聲明結(jié)構(gòu)的代碼:structname{intnamelen;charnamestr[l];}:然后又使用ー些內(nèi)存分配技巧使namestr數(shù)組用起來好像有多個元素。這樣合法和可移植嗎?是否有自動比較結(jié)構(gòu)的方法?如何向接受結(jié)構(gòu)參數(shù)的函數(shù)傳入常數(shù)值?怎樣從/向數(shù)據(jù)文件讀/寫結(jié)構(gòu)?我的編譯器在結(jié)構(gòu)中留卜了空洞,這導致空間浪費而且無法與外部數(shù)據(jù)文件進行’‘二進制”讀寫。能否關(guān)掉填充,或者控制結(jié)構(gòu)域的對齊方式?為什么sizeof返回的值大于結(jié)構(gòu)的期望值,是不是尾部有填充?如何確定域在結(jié)構(gòu)中的字節(jié)偏移?怎樣在運行時用名字訪問結(jié)構(gòu)中的域?程序運行正確,但退出時卻“coredump"了,怎么回事?可以初始化ー個聯(lián)合嗎?枚舉和一組預處理的#define有什么不同?有什么容易的顯示枚舉值符號的方法?結(jié)構(gòu)、聯(lián)合和枚舉聲明structxl{...}:和typc<k,fstruct.{...}x2:有什么不同?■ ,ゝ<|i'=J」リ.を,,<”1,If?-7:セゼI股的區(qū)別と住后ス屮你掲要用“structxl”引用說樸,同比“x2”引川冷れ.也就セ說,第種聲明更像種抽象類新一用戶不必知道它是外結(jié)構(gòu),實例/也イ需般使用structよ.說]為什么structx{...};xthostnut:不對?C"C++ 1'. ' !」.一I」,,ム2」ー個結(jié)構(gòu)可以包含指向自己的指針嗎??%nf以?與見河區(qū)LU在C語言中実現(xiàn)抽象數(shù)據(jù)類型什么方法最好????!使用聞二T4公卄定((也汴還隠藏在類型定ズかめ)ホ品構(gòu)?ア:.?-ケ好辦法 ;セイ、;デリ站構(gòu)成員,聲咽和使用繾名”結(jié)構(gòu)指桿(不構(gòu)類型指針)足.’泣的.達也止使用抽拿數(shù)國類型的原因.在C中是否有模擬繼承等面向?qū)ο蟪绦蛟O(shè)計特性的好方法?把函數(shù)指針直接加入到結(jié)構(gòu)中就可以實現(xiàn)簡單的“方法”.你可以使用各種不雅而暴力的方法來實現(xiàn)繼承,例如通過預處理器或含有“基類”的結(jié)構(gòu)作為開始的子集,但這些方法都不完美?很明顯,也沒有運算符的重載和國蓋(例如,“導出類”中的“方法”),那些必須人工去做。顯然的,如果你需要“真”的面向?qū)ο蟮某绦蛟O(shè)計,你繡要使用ー個支持這些特性的語言,例如C++。我遇到這樣聲明結(jié)構(gòu)的代碼:structname{infnainekn:charnaiiH'sh[l]:}:然后又使用一些內(nèi)存分配技巧使naiiicbtr數(shù)蛆用起來好像有多個元素,這樣合法和可移植嗎?這種技ギ十分講尚,盡斡DennisRitchie稱之為“知C’實現(xiàn)的無保:E的親密拉:.,的餅杯認定它沒行嚴格遵守C標準.盡論它。朱従所有的實現(xiàn)中都可以工作。仔細口で數(shù)組邊界的編譯器可能會發(fā)出警].ガ種可能一把變長的元家聲明為很大,而イ、是很小;在I一中:charnamestr[MAXSIZE];MAXSIZE比?何可隹存儲的name值都大?伊止,セ科技術(shù)似乎也イ、一全河合標準的嚴格解狎.這些嘖ナ結(jié)構(gòu)郡必雙小心使用,因為只仃樣字員知道它的大小,而里厚芻卻無所知.<799「、「??一? Ir■ ,類似間迎限供T個同酒的解決方案なワ德利:[Rationale.Sec35.4.2];[C9X.Sec.6.5.2,1]是否有自動比較結(jié)構(gòu)的方法?沒目.編譯緡沒有用単的“辦法實現(xiàn)常ド卄メ<:「し:"Jレ!==. ,.這也符合C的低な特件簡単的按字節(jié)比發(fā)會由」站構(gòu)中沒田M到的“空河”Q的隨機數(shù)據(jù)(蒙見同?82.10)j失敗;而按域比較在處理大結(jié)構(gòu)時需腹難以接大病中旦代碼.如果你需要比較兩個結(jié)構(gòu),你必涙I!ノ寫函數(shù)按壊比較.個い;?料“K&R2,Sec.G.2p.129];[Rationale.Sec.3.39];[HES,Sec5.6.2p.133].怎樣從/向數(shù)據(jù)文件讀/寫結(jié)構(gòu)?H^rite()\ifキ構(gòu)相對簡単:fwrite(fisomestruct,sizeofsomestruct,i,tp);rfrr;Mln UI,..:|*< . ? I? ?見十題2.1。和20.3)....i.い構(gòu)包a何指針,則只有指針值會被寫入文件,當它打円次讀冋來的時候,彼a險巳後失效破広,為ア泛的移植.你必須用ザ標金加卄工件:づ見間則I2.30弗加n更好的方案上寫對樂數(shù).用可核粒(nffis.至?人爪?)的方式按.立與詁構(gòu).盡む開始可能L作市布大.?1?f[HトエSec.15.13p381]我的編徑器在結(jié)構(gòu)u留下ア空洞.這導致空間浪費而且無法與外部致提文件進行”ニ走制“讀寫C能否關(guān)掉填元.或者控制結(jié)構(gòu)域的對齊方式?は些”交那寥ザ踴蟋頰滌炳冊中后面的城的對市垃也許必必I.J';ff..LJ;lI..1. ■' ,-I. '' 1l.JIM-1「cha!的美里)イ、勝處」點的內(nèi)住:也加,而必3il£2或4或?qū)H大小的倍數(shù),'.I1'. 一擴展用I,ゴ“,卜I-f住一樣pragma;-121).。ごセムI小曲的カ法.?見訶,巴20.3,.ヤ.:;M[K<kR2,SecG4p138];[HirS.Sec5.6.4p.135]為什么ヽiz。げ返回的值大于結(jié)構(gòu)的期望值.是不是尾部有填充?為「7仮分加江毎?ヨリ”ー效組トハ峋對齊,浩構(gòu)可虎口必い述劉川充即使,.,一 ',,[也,F]レ.加,siz,",t,「ソ1iゴ ,いトI訶即2.10久;匕テf[H\S.See.5.67pp139-40]如何詞定域在結(jié)構(gòu)中的字節(jié)僞移?ANSIC<L<stddef.h>中定義j"ofisetofOT,用otfeetof(structs.f)可以計.it結(jié)構(gòu)s中的偏移國如果出r某種原岡你需要門丄實現(xiàn)這個功屹可以使用下達這樣的代碼:^defineoffsetof(type,I)((size,)\((char?)&((type*)0)->f-(char*)(type*)0))i<種實現(xiàn)イ、ー100%的可穢植;發(fā)些編譯器可能會合法地拒地拉,受’ネ弓、:,[ISO,Sec7.1.6];[Rationale,Sec3.5.42],[HkS.Sec11.1pp292-3]201I年計算機等級考試二級C語言常見問題⑶問題列表:為什么這樣的代碼:a[i]=i++:不能工作?使用我的編譯器,下面的代碼inti=7;printf("%d\n",i++*i++);返回49?不管按什么順序計算,難道不該打印出56嗎?對于代碼inti=3;i=i++;不同編譯器給出不同的結(jié)果,有的為3,有的為4,哪個是正確的?這是個巧妙的表達式:a.=b.=a.=b它不需要臨時變量就可以交換a和b的值。我可否用括號來強制執(zhí)行我所需要的計算順序?可是&&和II運算符呢?我怎樣才能理解復雜表達式?“序列點’’是什么?那么,對于a國=i++;我們不知道a口的哪ー個分量會被改寫,但i的確會增加I,對嗎?++i和i++有什么區(qū)別?如果我不使用表達式的值,我應(yīng)該用++i或i++來自增ー個變量嗎?為什么如下的代碼inta=100,b=100;longintc=a*b;不能工作?我需要根據(jù)條件把ー個復雜的表達式賦值給兩個變量中的ー個。201I年計算機等級考試二級C語言常見問題(4)第4章指針問題列表:我想聲明-"個指針并為它分配?些空間,但卻不行。這些代碼有什么問題?char*p;*p=malloc(lO);*p++自增p還是p所指向的變量?我有一個char?型指針正巧指向ー些int型變量,我想跳過它們。為什么如下的代碼((int*)p)++;不行?我有個函數(shù),它應(yīng)該接受并初始化一個指針voidf(int*ip){staticintdummy=5;ip=&dummy;}但是當我如下調(diào)用時:int*ip;f(ip);調(diào)用者的指針卻沒有任何變化。我能否用void**指針作為參數(shù),使函數(shù)按引用接受一般指針?我有一個函數(shù)externintf(int*):它接受指向int型的指針。我怎樣用引用方式傳入一個常數(shù)?C有“按引用傳遞”嗎?我看到了用指針調(diào)用函數(shù)的不同語法形式。到底怎么冋事?我怎樣把ー個int變量轉(zhuǎn)換為char?型?為什么這樣的代碼:;巾]=i++:不能工作?千表達式耳十有tJ 一七?2改變i的值-bj7在同表達式的其它心ウセ引用,i4公け政無定義的"セ無從カ」:M弓Iリ1(イ邊ギa(chǎn)[i]|').ZIflfn坯是新値(注意,盡智?任K&R中建議這類と達式的行為イ、確定,但C標準卻強烈聲明它上無定義的,あ見?,網(wǎng)11.32リ匕市朽:[KArRl.Sec2.12];[K^R2,Sec.212];[ISO.Sec.6.3];[H&S,Sec.7.12pp.227-9],使用我的埸譯器.下面的代碼inti=7:printf(i++*i++):返回網(wǎng)?不管按什么順序計算.奉道不該打印出56嗎?‘,「,じ,」「…11;;++!:1- .一"イ''' .■:,沒有IHitJ, : .iuK!對友達式的其它部分進行計算之前〈即世行,也不能保i止變吊的更新會在去達式“完成”(按照ANSIC的術(shù)語,在ド個“Jt列點”之前,ぐ見何題3.7)之加的某個時刻逬廳.1例中,編譯器選擇使用變?的舊值相乘以后再對二十進行門增運算.包含多個不確定的副作用的代碼的行為總是被認為未定義.(簡單而言,“多個不確定副作用”是指在同一個表達式中使用導致同一對象修改兩次或修改以后又被引用的自增,自減和賦值操作符的任何組合.這是?個粗略的定義;嚴格的定義?見問題3.7,“未定義”的含義參見問題11.32。)甚至都不要試圖探窕這些東西在你的編譯器中是如何實現(xiàn)的(這與許多C教科書上的弱智練習正好相反);正如K&R明智地指出,“如果你不知道它們在不同的機器上如何實現(xiàn),這樣的無知可能恰恰會有助于保護你?!眳⒖假Y料:[K&R1,Sec.2.12p.50];[K&R2,Sec.2.12p.54];[ISO,Sec.6.3];[H&S,Sec.7.12pp.227-9];[CT&P,Sec.3.7p,47];[PCS,Sec,9.5pp.120-1].對于代碼infi=3:i=i++:不同編譯器給出不同的結(jié)果.有的カ3.有的為4.哪個是正確的?沒有」-答案:這個友達式無定義,參見問題3.1,3.7和11.32?同時注意,i++和++i部イ、同17+1如果你要使i門増1,使用i=i+l.i+=l.i++或++i.HiHI仃何組公,夢見同感3.10這是個巧妙的表達式:a=b=a=b它不需要臨時變量就可以交換a和b的值。這不具有可移植性?它H圖任序例.巨之間兩次修改變51%而這是無定義的.例如ぶ人報と如ド代碼:inta=123,b=7654;在SCO優(yōu)化C編譯將(ice)卜會把b置為123.把a.為0.參見問即3.1,3.7和20.14.我可否用括號來強制執(zhí)行我所需要的廿算順序??米ー?不行.運一苻優(yōu)先級和括弧只能賦ア衣達是計算部分的順序.在處ド的代碼中1()+g()?h()盡管我們知道乘法運算在加法之前,仲達井イ、或迎マスノ、閑數(shù)啷個會被首先調(diào)用.如果你后公桶保千な達人的什6m人你可花而收使用訓姉的怖H史,和獨在的済句.―用耍同:[KkRl.Sec.2.12p.49,SeeA7p];[K&R2,Sec2.12pp.52-3.Sec.A.7p.200.].可是&&和I!運算符呢?我看到過類似while((ぐ=getchar())!=EOF&&<!=へ1/)的代碼 這些運算符在此處。?個特蛛的?<知路、例外:如果左邊的づ表達大決定網(wǎng)絡(luò)I<ノJII和蝕于&亞)則右邊的子我達式不會計算因此,從左至《的計"可以確保,對過號ぜ州式也是如此.而且,所有這些運算符(包括?:)都會弓へ個物外的內(nèi)部序例點(參見問題3.7).書號ー料:[K&R1,Sec.2.6p.38.Sees.A7.11-12pp.190-1];[K&R2,Sec.2.6p.41.Secs.A7.14-15pp.207-8];[ISO,.See6.3.13.Sec.6.3.14.Sec.6.3.15];[H&S,See.7.7pp217-8.Sec.7.8pp.218-20,Sec.7.12.1p.229];[CTicP.Sec.3.7pp.46-7]我怎樣才能理解復雜表達式???序列點”是什么?戶列由及卜時間點(在第個表達式仝部計リ完や之后或任II、パ卜、?:成,, 1l<I,H' ■_,' 'IANSI/ISOC標準這樣描述:<£!個和ド個序列點之間,?個對案所保存的值至名只廢被改達式的計算修改次而HWカ值只俄用「決定將要保存的值.第一句M比較費解.它說住個衣達式中如果策個對象而セ寫入,則在同ん達式中對該對女的訪問應(yīng)該只局限「れ接用「?計算將要寫入的侑這糸規(guī)則ん詭確保在修改之的オ訪問變量的衰達式為合法,例如i=i+i介ド..;]a[i]=i++Wス1ノ.(,;見リ虺3.1)蓼見ド過的同題3.&芍ヮ誄科:[ISO,Sec,.Sec.6.3,Sec.6.6.AnnexC];[Rationale.See.2.12.3]:[H1fcs.See712.1pp228-9]那么.對于a[i]=i++:我們不知道n[]的哪ー個ガ量會被改寫.但i的確會増加!.對嗎?イー定[如果個&達式和一ー變存未定義,則它的所有方面都會變成人定義,參見問題3.2,3.3,11.32fD11.35.++i和i++有什么區(qū)別?如果你的C諳ri-沒有說明它們的區(qū)別,那么買.燈的荷.而二:++iI.1-, 川任用它的我達式“返冋”新的.増加后的值;而i++對i增加,但返冋原來的足本增加的值.如里我不使用表達式的值.我應(yīng)該用++i或i++來自增ー個変量嗎?由r?一兩種格式區(qū)別儀在川成的值,所以在僅使用它"I的副作用時,r±樣.但工.在C++中,前綴方式卻是首選.,?見問即3.3.為什么如下的代碼infa=100.I>=100:k”用int<?=a*1>:不能工作?根據(jù)C的內(nèi)部類型轉(zhuǎn)換規(guī)則,乘法足用int進行的,而其結(jié)果可能在轉(zhuǎn)換為I,“ほ:駅片ム邊的c之前溢出或被破用.可以使用明確的英軍話拉.強れ乗;丿.以long里進行:longintc=(longlnt)a?b;注.?.,(longinり(a*b)不能達到需要的效果..當兩個整數(shù)做除法一結(jié)?賦リ個一點變俗」,也行H能白同!(哭璽的何題,解決方法也讓類似的’ゝU資料:[K&RLScc.2.7p,41];[KicR2.Sec.2.7p.44].[ISO.Sec];陋S,使用我的編輯器,ド口的代碼];[CT&P,Sec.3.9pp49-50]我需要根據(jù)條件把ー個復雜的表達式賦值給兩個變量中的ー個0可以用下邊這樣的代碼嗎?((condition)1!a:b)=conipli-catctLexprobh>n:一、/ .:? ii.iiMfi.in, 也..?:能生成卜“,f伍”.如果你れ的霰要.丨丨!I:I |代碼?((condition)?£a:&b)=compllcated_expresslon;盡管這亳無憂林可£.なサ資料:[ISO.See.63.15];[H&S,Sec.7.1pp.179-180]201I年計算機等級考試二級C語言常見問題(4)第4章指針問題列表:我想聲明一個指針并為它分配ー些空間,但卻不行。這些代碼有什么問題?char*p;*p=malloc(lO);*p++自增p還是p所指向的變量?我有一個char?型指針正巧指向ー些int型變量,我想跳過它們。為什么如ド的代碼((int*)p)++;不行?我有個函數(shù),它應(yīng)該接受并初始化一?個指針voidf(int*ip){staticintdummy=5;ip=&dummy;)但是當我如下調(diào)用時:int*ip;f(ip);調(diào)用者的指針卻沒有任何變化。我能否用void*?指針作為參數(shù),使函數(shù)按引用接受一般指針?我有一個函數(shù)externintf(int*);它接受指向int型的指針。我怎樣用引用方式傳入一個常數(shù)?C有“按引用傳遞”嗎?我看到了用指針調(diào)用函數(shù)的不同語法形式。到底怎么回事?我怎樣把ー個int變量轉(zhuǎn)換為char?型?指針我想聲明一個指針并為它分配ー些空間.但卻不行。這些代碼有什么問題?ch;ir*p:*|?=iualloc(10):你一聲明的指針讓p.iiijイ;:Lp,當你操作指針本牙時(例如當你對其M值,使之指向別處時%你只露要使用指針的名字即可:p=malloc(10);ー你找用指針指向的內(nèi)俘?你4需豊使用?作為間接操作符:?p=H;參ー問題!.7,7.1,7.5和8.3.挈ヮ耍セ[CT&P.Sec3.1p28]*p++自增卩還是卩所指向的變量?一:.++,1—打。I' '"ソ11カれ先級品.因此*p++和?リ,++「ノー3p二冋pi地と血所指向的值,変門増p指向的值?使用ドp卄+,如果劭作用的川ib無關(guān)緊変也可以使用++*p,參サ日料:[KArRl.Sec.5.1p.91];[K&R2,Sec5.1p.95];[ISO.Sec.6.3.2.Sec.63.3];[HNS,Sec7.4.4pp.192-3.Sec.7.5p193.Secs.7.57,7.5.8pp199-200].我有一個char?型指針正巧指向ー些int型變量.我想跳過它們。為什么如下的代碼((iut*)1>)++:不行?C「山,?」 ". . 1「リ,葉::巴」)?1:時?整生個轉(zhuǎn)換按作符.根據(jù)定ス它只倨‘I成トム值(rvalue) 右值氏1-賦值.也不能用/白増(如果編譯霽支持這樣的擴展,那要么是個么足有意作出的科標準擴展.)要達到你的目的可以用:p=(char?)((int*)p+1);或者,因為p是char?型.直接用p+=sizeof(int);伸足,在可能的情況ド.你「」1士代せ當?shù)闹羔橆惱?而不足味地成權(quán)李代桃價Vワ資料[K&R2.Sec.A7.5p.205];[ISO.Sec,6.34];[Rationale,Sec.J[HA:S,Sec.71pp.179-80]我有個函數(shù).它應(yīng)該接受并初始化一個指針voidf(int*ip)[staticintdiiininy=5:ip=jcdinniny:}但是當我如下調(diào)用時:int*ip:f(ip):調(diào)用者的指針卻沒有任何變化。?ー函數(shù)初始化的是你希里它初始化 ' -: ?C< .I過值傳遞的被調(diào)函數(shù)僅僅修改了傳人的指什副本你所要傳入指針的戈'數(shù)變成接受指計的指針),域お(?圖數(shù)返冋指針.參見問題ユ5和17.我能否用void**指針作為參數(shù).使函數(shù)按引用接受一般指針?一叫移司?c中沒有股的指針的指計類型void?可以用作股指針只;因為當它和其它類型相m除值的時候,如果而要,它可以ウ動轉(zhuǎn)換成其它類<;0!イI知自徉的換.所指類型為void?之外的類型的void*?指包嗎,這個,換下能完成?我有一個函數(shù)。Xtcciii>tf(hit*):它接受指向int型的指針。我怎樣用引用方式傳入ー個常數(shù)?下面這樣的調(diào)用f(&5):似乎不行。在C99中.你可以便用,戈公常ST:f((lntD){5B;?i I.' ' ,l(i'Li11.址傳給函數(shù):Intfive=5;f(tfive);參見時題2.8.丄4Ki20.1C有“按引用傳遞“嗎?真的沒有.嚴格地講,c總C按值傳遞,你可以口に口擬按引用傳遞.定義接受指針的俅:數(shù),然后在調(diào)用時使用&操作符?學實I,當你同由數(shù)傳入數(shù)組(傳入指ft的情況參見同題6.4及其它)対.潴渾器"麗I就入住糧擬按引用傳遞.但世C沒有任何I!氏的按引用傳遞或C++的弓用/數(shù)的東西I:.?I?預處瑪な4以鞏供種“按名稱心遞”的形式.?見問?84.4和20」.?考資料:[K&R1.Sec.1.8pp.24-5,Sec.5.2pp.91-3]JK&R2,Sec1.8pp27-8.Sec.5.2pp.95-7]:[ISO.Sec.6.322]:[H&S,Sec.9.5pp.273-4]我看到了用指針調(diào)用函數(shù)的不同語法形式°到底怎么回事?最初,個函效指針心涉用*操作符(和對額外的括弧)“轉(zhuǎn)換為”?個”真正的”函數(shù)才能調(diào)用:intr,funcO,(*ip)〇=func;r=(*fp)();ナ函數(shù)總是通過指針進行一用的,! 丁,二’「ー」「 iiful1,I '.It■iin:I .fp函數(shù)名和函數(shù)的指針r=fp();ANSIC標沖文師I接受ム山的解fれ達總J:丨:,. 1允許??見問題1.14學書?科:[K&Rl.See.5.12p116];[K^R2,See.5.11p120];[ISO,Sec.6.3.2^].[Rationale.Sec.3.3.2J];[H&S,Sec5.8p,147,Sec.74.3p.190]我怎樣把一個int變量轉(zhuǎn)換為<liar?型?我試了類型轉(zhuǎn)換.但是不行。一取決「你希望做什么如果你的類型轉(zhuǎn)換不成功,你可能是企圖把整數(shù)轉(zhuǎn)為了符串,這種情況參見問題131.S1果你試圖把整數(shù)轉(zhuǎn)換為字符.參見問題8.4如果你忒陽計個指針指向特定的內(nèi)存地址,夢見問題19.29.201I年計算機等級考試二級C語言常見問題(5)第5章空(null)指針問題列表:5.!臭名昭著的空指針到底是什么?怎樣在程序里獲得一個空指針?用縮寫的指針比較“if(p)”檢查空指針是否可靠?如果空指針的內(nèi)部表達不是〇會怎么樣?NULL是什么,它是怎么定義的?在使用非全零作為空指針內(nèi)部表達的機器上,NULL是如何定義的?如果NULL定義成#defineNULL((char*)0)難道不就可以向函數(shù)傳入不加轉(zhuǎn)換的NULL了嗎?如果NULL和〇作為空指針常數(shù)是等價的,那我到底該用哪ー個呢?但是如果NULL的值改變了,比如在使用非零內(nèi)部空指針的機器卜.,難道用NULL(而不是。)不是更好嗎?用預定義宏#defineNullptr(type)(type*)0幫助創(chuàng)建正確類型的空指針。這有點奇怪。NULL可以確保是〇,但空(null)指針卻不一定?為什么有那么多關(guān)于空指針的疑惑?為什么這些問題如此經(jīng)常地出現(xiàn)?我很困惑。我就是不能理解這些空指針?類的東西??紤]到有關(guān)空指針的所有這些困惑,難道把要求它們內(nèi)部表達都必須為〇不是更簡單嗎?說真的,真有機器用非零空指針嗎,或者不同類型用不同的表達?運行時的“空指針賦值”錯誤是什么意思?空(null)指針臭名昭著的空指針到底是什么?語;,定義中說叨,每種指計類里酣有個特殊值——“空指針”——它。同類型的其它所有指針值都不相同,它-與任何對象或函數(shù)的指針值都不相等“也就足說?取地址被作符&永州也不能得到空指針,同H對maUoc()的成功調(diào)用也イ、會返問空指針,如果失敗,maUoc()的確返冋空指計」小と::?指針的鼎里用法:衣示“イ、分陀”或者“尚未指向任何地方”的指,匕空指針在極念I(lǐng)不同廣卡初始化的指針空指針可以蝶仟イ;指向任何對案或? , : I可能指向任何崎、參見問題L10、7.1和7.26加卜?文所述,毎種指針一一都有ト空指針,而

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論