版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、-. z. Back to man.ChinaUni*.net 高質(zhì)量C+/C編程指南文件狀態(tài) 草稿文件 正式文件 更改正式文件文件標(biāo)識(shí):當(dāng)前版本:1.0 林銳博士完成日期:2001年7月24日版本歷史版本/狀態(tài)作者參與者起止日期備注V 0.9草稿文件林銳2001-7-1至2001-7-18林銳起草V 1.0正式文件林銳2001-7-18至2001-7-24朱洪海審查V 0.9,林銳修正草稿中的錯(cuò)誤目錄 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633987 前言6 HYPERLINK man.chinauni*.net
2、/develop/c&c+/c/c.htm l _Toc520633988 第1章文件構(gòu)造11 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633989 1.1 和版本的聲明11 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633990 1.2 頭文件的構(gòu)造12 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633991 1.3 定義文件的構(gòu)造13 HYPERLINK man.chi
3、nauni*.net/develop/c&c+/c/c.htm l _Toc520633992 1.4 頭文件的作用13 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633993 1.5 目錄構(gòu)造14 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633994 第2章程序的版式15 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633995 2.1 空行15 HYPERLINK man
4、.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633996 2.2 代碼行16 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633997 2.3 代碼行的空格17 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633998 2.4 對(duì)齊18 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520633999 2.5 長(zhǎng)行拆分19 HYPERLINK
5、man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634000 2.6 修飾符的位置19 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634001 2.7 注釋20 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634002 2.8 類(lèi)的版式21 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634003 第3章命名規(guī)則22 HYPERLI
6、NK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634004 3.1 共性規(guī)則22 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634005 3.2 簡(jiǎn)單的Windows應(yīng)用程序命名規(guī)則23 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634006 3.3 簡(jiǎn)單的Uni*應(yīng)用程序命名規(guī)則25 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _To
7、c520634007 第4章表達(dá)式和根本語(yǔ)句26 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634008 4.1 運(yùn)算符的優(yōu)先級(jí)26 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634009 4.2 復(fù)合表達(dá)式27 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634010 4.3 if 語(yǔ)句27 HYPERLINK man.chinauni*.net/develop/c&c+/c
8、/c.htm l _Toc520634011 4.4 循環(huán)語(yǔ)句的效率29 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634012 4.5 for 語(yǔ)句的循環(huán)控制變量30 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634013 4.6 switch語(yǔ)句30 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634014 4.7 goto語(yǔ)句31 HYPERLINK man.chinau
9、ni*.net/develop/c&c+/c/c.htm l _Toc520634015 第5章常量33 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634016 5.1 為什么需要常量33 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634017 5.2 const 與 #define的比擬33 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634018 5.3 常量定義規(guī)則33
10、HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634019 5.4 類(lèi)中的常量34 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634020 第6章函數(shù)設(shè)計(jì)36 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634021 6.1 參數(shù)的規(guī)則36 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634022 6.2 返回
11、值的規(guī)則37 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634023 6.3 函數(shù)部實(shí)現(xiàn)的規(guī)則39 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634024 6.4 其它建議40 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634025 6.5 使用斷言41 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634
12、026 6.6 引用與指針的比擬42 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634027 第7章存管理44 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634028 7.1存分配方式44 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634029 7.2常見(jiàn)的存錯(cuò)誤及其對(duì)策44 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l
13、 _Toc520634030 7.3指針與數(shù)組的比照45HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634031 7.4指針參數(shù)是如何傳遞存的?47 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634032 7.5 free和delete把指針怎么啦?50 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634033 7.6 動(dòng)態(tài)存會(huì)被自動(dòng)釋放嗎?50 HYPERLINK man.ch
14、inauni*.net/develop/c&c+/c/c.htm l _Toc520634034 7.7 杜絕野指針51 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634035 7.8 有了malloc/free為什么還要new/delete ?52 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634036 7.9 存耗盡怎么辦?53 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520
15、634037 7.10 malloc/free 的使用要點(diǎn)54 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634038 7.11 new/delete 的使用要點(diǎn)55 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634039 7.12 一些心得體會(huì)56 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634040 第8章 C+函數(shù)的高級(jí)特性57 HYPERLINK man.china
16、uni*.net/develop/c&c+/c/c.htm l _Toc520634041 8.1 函數(shù)重載的概念57 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634042 8.2 成員函數(shù)的重載、覆蓋與隱藏60 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634043 8.3 參數(shù)的缺省值63 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634044 8.4 運(yùn)算符重載64
17、HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634045 8.5 函數(shù)聯(lián)65 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634046 8.6 一些心得體會(huì)68 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634047 第9章類(lèi)的構(gòu)造函數(shù)、析構(gòu)函數(shù)與賦值函數(shù)69 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc52063
18、4048 9.1 構(gòu)造函數(shù)與析構(gòu)函數(shù)的起源69 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634049 9.2 構(gòu)造函數(shù)的初始化表70 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634050 9.3 構(gòu)造和析構(gòu)的次序72 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634051 9.4 例如:類(lèi)String的構(gòu)造函數(shù)與析構(gòu)函數(shù)72 HYPERLINK man.chinauni*
19、.net/develop/c&c+/c/c.htm l _Toc520634052 9.5 不要輕視拷貝構(gòu)造函數(shù)與賦值函數(shù)73 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634053 9.6 例如:類(lèi)String的拷貝構(gòu)造函數(shù)與賦值函數(shù)73 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634054 9.7 偷懶的方法處理拷貝構(gòu)造函數(shù)與賦值函數(shù)75 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _
20、Toc520634055 9.8 如何在派生類(lèi)中實(shí)現(xiàn)類(lèi)的根本函數(shù)75 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634056 9.9 一些心得體會(huì)77 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634057 第10章類(lèi)的繼承與組合78 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634058 10.1 繼承78 HYPERLINK man.chinauni*.net/devel
21、op/c&c+/c/c.htm l _Toc520634059 10.2 組合80 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634060 第11章其它編程經(jīng)歷82 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634061 11.1 使用const提高函數(shù)的強(qiáng)健性82 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634062 11.2 提高程序的效率84 HYPERLINK ma
22、n.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634063 11.3 一些有益的建議85 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634064 參考文獻(xiàn)87 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634065 附錄A :C+/C代碼審查表88 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634066 附錄B :C+/C試題93
23、 HYPERLINK man.chinauni*.net/develop/c&c+/c/c.htm l _Toc520634067 附錄C :C+/C試題的答案與評(píng)分標(biāo)準(zhǔn)97前言軟件質(zhì)量是被大多數(shù)程序員掛在嘴上而不是放在心上的東西!除了完全外行和真正的編程高手外,初讀本書(shū),你最先的感受將是驚慌:哇!我以前捏造的C+/C程序怎么會(huì)有則多的毛病?別難過(guò),作者只不過(guò)比你早幾年、多幾次驚慌而已。請(qǐng)花一兩個(gè)小時(shí)認(rèn)真閱讀這本百頁(yè)經(jīng)書(shū),你將會(huì)獲益匪淺,這是前面N-1個(gè)讀者的建議。一、編程老手與高手的誤區(qū)自從計(jì)算機(jī)問(wèn)世以來(lái),程序設(shè)計(jì)就成了令人羨慕的職業(yè),程序員在受人寵愛(ài)之后容易開(kāi)展成為毛病特多卻常能自我臭美的
24、群體。如今在Internet上流傳的真正的程序員據(jù)說(shuō)是這樣的:(1)真正的程序員沒(méi)有進(jìn)度表,只有討好領(lǐng)導(dǎo)的馬屁精才有進(jìn)度表,真正的程序員會(huì)讓領(lǐng)導(dǎo)提心吊膽。(2)真正的程序員不寫(xiě)使用說(shuō)明書(shū),用戶(hù)應(yīng)當(dāng)自己去猜測(cè)程序的功能。(3)真正的程序員幾乎不寫(xiě)代碼的注釋?zhuān)绻⑨尯茈y寫(xiě),它理所當(dāng)然也很難讀。(4)真正的程序員不畫(huà)流程圖,原始人和文盲才會(huì)干這事。(5)真正的程序員不看參考手冊(cè),新手和膽小鬼才會(huì)看。(6)真正的程序員不寫(xiě)文檔也不需要文檔,只有看不懂程序的笨蛋才用文檔。(7)真正的程序員認(rèn)為自己比用戶(hù)更明白用戶(hù)需要什么。(8)真正的程序員不承受團(tuán)隊(duì)開(kāi)發(fā)的理念,除非他自己是頭頭。(9)真正的程序員的程
25、序不會(huì)在第一次就正確運(yùn)行,但是他們?cè)敢馐刂鴻C(jī)器進(jìn)展假設(shè)干個(gè)30小時(shí)的調(diào)試改錯(cuò)。(10)真正的程序員不會(huì)在上午9:00到下午5:00之間工作,如果你看到他在上午9:00工作,這說(shuō)明他從昨晚一直干到現(xiàn)在。具備上述特征越多,越顯得水平高,資格老。所以別奇怪,程序員的很多缺點(diǎn)竟然可以被當(dāng)作優(yōu)點(diǎn)來(lái)欣賞。就象在武俠小說(shuō)中,那些獨(dú)來(lái)獨(dú)往、不受約束且?guī)c(diǎn)邪氣的高手最令人崇拜。我曾經(jīng)也這樣信奉,并且希望自己成為那樣的真正的程序員,結(jié)果沒(méi)有得到好下場(chǎng)。我從讀大學(xué)到博士畢業(yè)十年來(lái)一直勤奮好學(xué),累計(jì)編寫(xiě)了數(shù)十萬(wàn)行C+/C代碼。有這樣的苦勞和疲勞,我應(yīng)該稱(chēng)得上是編程老手了吧?我開(kāi)發(fā)的軟件都與科研相關(guān)集成電路CAD和3D
26、圖形學(xué)領(lǐng)域,動(dòng)輒數(shù)萬(wàn)行程序,技術(shù)復(fù)雜,難度頗高。這些軟件頻頻獲獎(jiǎng),有一個(gè)軟件獲得首屆中國(guó)大學(xué)生電腦大賽軟件展示一等獎(jiǎng)。在1995年開(kāi)發(fā)的一套圖形軟件庫(kù)到2000年還有人買(mǎi)。羅列出這些業(yè)績(jī),可以說(shuō)明我算得上是編程高手了吧?可惜這種個(gè)人感覺(jué)不等于事實(shí)。讀博期間我曾用一年時(shí)間開(kāi)發(fā)了一個(gè)近10萬(wàn)行C+代碼的3D圖形軟件產(chǎn)品,我心得意外表謙虛地向一位真正的軟件高手請(qǐng)教。他雖然從未涉足過(guò)3D圖形領(lǐng)域,卻在幾十分鐘指出該軟件多處重大設(shè)計(jì)錯(cuò)誤。讓人感覺(jué)那套軟件是用紙糊的華美衣服,扯一下掉一塊,戳一下破個(gè)洞。我目瞪口呆地意識(shí)到這套軟件毫無(wú)實(shí)用價(jià)值,一年的心血白化了,并且害死了自己的軟件公司。人的頓悟通常發(fā)生在最
27、心痛的時(shí)刻,在沮喪和心痛之后,我作了深刻反省,面壁半年,重新溫習(xí)軟件設(shè)計(jì)的根底知識(shí)。補(bǔ)修功之后,又覺(jué)得腰板硬了起來(lái)。博士畢業(yè)前半年,我曾到微軟中國(guó)研究院找工作,承受微軟公司一位資深軟件工程師的面試。他讓我寫(xiě)函數(shù)strcpy的代碼。太容易了吧?錯(cuò)!這么一個(gè)小不點(diǎn)的函數(shù),他從三個(gè)方面考察:1編程風(fēng)格;2出錯(cuò)處理;3算法復(fù)雜度分析用于提高性能。在大學(xué)里從來(lái)沒(méi)有人如此嚴(yán)格地考察過(guò)我的程序。我化了半個(gè)小時(shí),修改了數(shù)次,他還不盡滿(mǎn)意,讓我回家好好琢磨。我精神抖擻地進(jìn)考場(chǎng),大汗淋漓地出考場(chǎng)。這高手當(dāng)?shù)靡蔡C囊了。我又好好地反省了一次。我把反省后的心得體會(huì)寫(xiě)成文章放在網(wǎng)上傳閱,引起了不少軟件開(kāi)發(fā)人員的共鳴。我
28、因此有幸和國(guó)產(chǎn)大型IT企業(yè)如華為、貝爾、中興等公司的同志們廣泛交流。大家認(rèn)為提高質(zhì)量與生產(chǎn)率是軟件工程要解決的核心問(wèn)題。高質(zhì)量程序設(shè)計(jì)是非常重要的環(huán)節(jié),畢竟軟件是靠編程來(lái)實(shí)現(xiàn)的。我們心目中的老手們和高手們能否編寫(xiě)出高質(zhì)量的程序來(lái)?不見(jiàn)得都能!就我的經(jīng)歷與閱歷來(lái)看,國(guó)大學(xué)的計(jì)算機(jī)教育壓根就沒(méi)有灌輸高質(zhì)量程序設(shè)計(jì)的觀念,教師們和學(xué)生們也很少自覺(jué)關(guān)心軟件的質(zhì)量。勤奮好學(xué)的程序員長(zhǎng)期在低質(zhì)量的程序堆中滾爬,吃盡苦頭之后才有一些心得體會(huì),長(zhǎng)進(jìn)極慢,我就是一例。現(xiàn)在國(guó)IT企業(yè)擁有學(xué)士、碩士、博士文憑的軟件開(kāi)發(fā)人員比比皆是,但他們?cè)诔惺艽髮W(xué)教育時(shí)就先天缺乏,豈能一到企業(yè)就突然實(shí)現(xiàn)質(zhì)的飛躍。試問(wèn)有多少軟件開(kāi)發(fā)
29、人員對(duì)正確性、強(qiáng)健性、可靠性、效率、易用性、可讀性可理解性、可擴(kuò)展性、可復(fù)用性、兼容性、可移植性等質(zhì)量屬性了如指掌?并且能在實(shí)踐中運(yùn)用自如?。高質(zhì)量可不是干活小心點(diǎn)就能實(shí)現(xiàn)的!我們有充分的理由疑慮:1編程老手可能會(huì)長(zhǎng)期用隱含錯(cuò)誤的方式編程習(xí)慣成自然,發(fā)現(xiàn)毛病后都不愿相信那是真的!2編程高手可以在*一領(lǐng)域?qū)懗鰳O有水平的代碼,但未必能從全局把握軟件質(zhì)量的方方面面。事實(shí)證明如此。我到貝爾工作一年來(lái),陸續(xù)面試或測(cè)試過(guò)近百名新老程序員的編程技能,質(zhì)量合格率大約是10。很少有人能夠?qū)懗鐾耆腺|(zhì)量要求的if語(yǔ)句,很多程序員對(duì)指針、存管理一知半解,。領(lǐng)導(dǎo)們不敢相信這是真的。我做過(guò)現(xiàn)場(chǎng)試驗(yàn):有一次部門(mén)新進(jìn)14
30、名碩士生,在開(kāi)歡送會(huì)之前對(duì)他們進(jìn)展C+/C編程技能摸底考試。我問(wèn)大家試題難不難?所有的人都答復(fù)不難。結(jié)果沒(méi)有一個(gè)人及格,有半數(shù)人得零分。競(jìng)爭(zhēng)對(duì)手公司的朋友們也做過(guò)試驗(yàn),同樣一敗涂地。真的不是我心狠手辣或者要求過(guò)高,而是很多軟件開(kāi)發(fā)人員對(duì)自己的要求不夠高。要知道華為、貝爾、中興等公司的員工素質(zhì)在國(guó)IT企業(yè)中是比擬前列的,倘假設(shè)他們的編程質(zhì)量都如此差的話(huà),我們?cè)趺锤移谕行」灸贸龈哔|(zhì)量的軟件呢?連程序都編不好,還談什么振興民族軟件產(chǎn)業(yè),豈不胡扯。我打算定義編程老手和編程高手,請(qǐng)您別見(jiàn)笑。定義1:能長(zhǎng)期穩(wěn)定地編寫(xiě)出高質(zhì)量程序的程序員稱(chēng)為編程老手。定義2:能長(zhǎng)期穩(wěn)定地編寫(xiě)出高難度、高質(zhì)量程序的程序員
31、稱(chēng)為編程高手。根據(jù)上述定義,馬上得到第一推論:我既不是高手也算不上是老手。在寫(xiě)此書(shū)前,我閱讀了不少程序設(shè)計(jì)方面的英文著作,越看越羞慚。因?yàn)榘l(fā)現(xiàn)自己連編程根本技能都未能全面掌握,頂多算是二流水平,還好意思談什么老手和高手。希望和我一樣在國(guó)土生土長(zhǎng)的程序員朋友們能夠做到:1知錯(cuò)就改;2經(jīng)常溫故而知新;3堅(jiān)持學(xué)習(xí),天天向上。二、本書(shū)導(dǎo)讀首先請(qǐng)做附錄B的C+/C試題不要看答案,考察自己的編程質(zhì)量終究如何。然后參照答案嚴(yán)格打分。1如果你只得了幾十分,請(qǐng)不要聲,也不要太難過(guò)。編程質(zhì)量差往往是由于不良習(xí)慣造成的,與人的智力、能力沒(méi)有多大關(guān)系,還是有藥可救的。成績(jī)?cè)讲?,可以進(jìn)步的空間就越大,中國(guó)不就是在落后中
32、趕超興旺資本主義國(guó)家嗎?只要你能下決心改掉不良的編程習(xí)慣,第二次考試就能及格了。2如果你考及格了,說(shuō)明你的技術(shù)根底不錯(cuò),希望你能虛心學(xué)習(xí)、不斷進(jìn)步。如果你還沒(méi)有找到適宜的工作單位,不妨到貝爾試一試。3如果你考出85分以上的好成績(jī),你有義務(wù)和資格為你所在的團(tuán)隊(duì)作C+/C編程培訓(xùn)。希望你能和我們多多交流、相互促進(jìn)。半年前我曾經(jīng)發(fā)現(xiàn)一顆好苗子,就把他挖到我們小組來(lái)。4如果你在沒(méi)有任何提示的情況下考了總分值,希望你能收我做你的徒弟。編程考試完畢后,請(qǐng)閱讀本書(shū)的正文。本書(shū)第一章至第六章主要論述C+/C編程風(fēng)格。難度不高,但是細(xì)節(jié)比擬多。別小看了,提高質(zhì)量就是要從這些點(diǎn)點(diǎn)滴滴做起。世上不存在最好的編程風(fēng)格
33、,一切因需求而定。團(tuán)隊(duì)開(kāi)發(fā)講究風(fēng)格一致,如果制定了大家認(rèn)可的編程風(fēng)格,則所有組員都要遵守。如果讀者覺(jué)得本書(shū)的編程風(fēng)格比擬合你的工作,則就采用它,不要只看不做。人在小時(shí)候說(shuō)話(huà)發(fā)音不準(zhǔn),寫(xiě)字潦草,如果不改正,總有懊悔的時(shí)候。編程也是同樣道理。第七章至第十一章是專(zhuān)題論述,技術(shù)難度比擬高,看書(shū)時(shí)要積極思考。特別是第七章存管理,讀了并不表示懂了,懂了并不表示就能正確使用。有一位同事看了第七章后覺(jué)得野指針寫(xiě)得不錯(cuò),與我切磋了一把??墒沁^(guò)了兩周,他告訴我,他忙了兩天追查出一個(gè)Bug,想不到又是野指針出問(wèn)題,只好重讀第七章。光看本書(shū)對(duì)提高編程質(zhì)量是有限的,建議大家閱讀本書(shū)的參考文獻(xiàn),那些都是經(jīng)典名著。如果你的
34、編程質(zhì)量已經(jīng)過(guò)關(guān)了,不要就此滿(mǎn)足。如果你想成為優(yōu)秀的軟件開(kāi)發(fā)人員,建議你閱讀并按照CMMI規(guī)做事,讓自己的綜合水平上升一個(gè)臺(tái)階。貝爾的員工可以向網(wǎng)絡(luò)應(yīng)用事業(yè)部軟件工程研究小組索取CMMI有關(guān)資料,最好能參加培訓(xùn)。三、聲明本書(shū)的大局部容取材于作者一年前的書(shū)籍手稿尚未出版,現(xiàn)整理匯編成為貝爾網(wǎng)絡(luò)應(yīng)用事業(yè)部的一個(gè)規(guī)化文件,同時(shí)作為培訓(xùn)教材。由于C+/C編程是眾所周知的技術(shù),沒(méi)有什么可言。編程的好經(jīng)歷應(yīng)該大家共享,我們自己也是這么學(xué)來(lái)的。作者愿意公開(kāi)本書(shū)的電子文檔。聲明如下:1讀者可以任意拷貝、修改本書(shū)的容,但不可以篡改作者及所屬單位。2未經(jīng)作者許可,不得出版或大量印發(fā)本書(shū)。3如果競(jìng)爭(zhēng)對(duì)手公司的員工得
35、到本書(shū),請(qǐng)勿公開(kāi)使用,以免發(fā)生糾紛。預(yù)計(jì)到2002年7月,我們將建立切合中國(guó)國(guó)情的CMMI 3級(jí)解決方案。屆時(shí),包括本書(shū)在的約1000頁(yè)規(guī)將嚴(yán)格受控。歡送讀者對(duì)本書(shū)提出批評(píng)建議。林銳,2001年7月第1章文件構(gòu)造每個(gè)C+/C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的聲明declaration,稱(chēng)為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)implementation,稱(chēng)為定義definition文件。C+/C程序的頭文件以.h為后綴,C程序的定義文件以.c為后綴,C+程序的定義文件通常以.cpp為后綴也有一些系統(tǒng)以.cc或.c*為后綴。1.1 和版本的聲明和版本的聲明位于頭文件和定義文件的開(kāi)頭參見(jiàn)
36、例如1-1,主要容有:1信息。2文件名稱(chēng),標(biāo)識(shí)符,摘要。3當(dāng)前版本號(hào),作者/修改者,完成日期。4版本歷史信息。/* Copyright (c) 2001,貝爾網(wǎng)絡(luò)應(yīng)用事業(yè)部* All rights reserved.* * 文件名稱(chēng):filename.h* 文件標(biāo)識(shí):見(jiàn)配置管理方案書(shū)* 摘 要:簡(jiǎn)要描述本文件的容* * 當(dāng)前版本:1.1* 作 者:輸入作者或修改者名字* 完成日期:2001年7月20日* 取代版本:1.0 * 原作者 :輸入原作者或修改者名字* 完成日期:2001年5月10日*/例如1-1 和版本的聲明1.2 頭文件的構(gòu)造頭文件由三局部容組成:1頭文件開(kāi)頭處的和版本聲明參見(jiàn)例如
37、1-1。2預(yù)處理塊。3函數(shù)和類(lèi)構(gòu)造聲明等。假設(shè)頭文件名稱(chēng)為 graphics.h,頭文件的構(gòu)造參見(jiàn)例如1-2?!疽?guī)則1-2-1】為了防止頭文件被重復(fù)引用,應(yīng)當(dāng)用ifndef/define/endif構(gòu)造產(chǎn)生預(yù)處理塊?!疽?guī)則1-2-2】用#include 格式來(lái)引用標(biāo)準(zhǔn)庫(kù)的頭文件編譯器將從標(biāo)準(zhǔn)庫(kù)目錄開(kāi)場(chǎng)搜索。【規(guī)則1-2-3】用#include filename.h 格式來(lái)引用非標(biāo)準(zhǔn)庫(kù)的頭文件編譯器將從用戶(hù)的工作目錄開(kāi)場(chǎng)搜索?!窘ㄗh1-2-1】頭文件中只存放聲明而不存放定義在C+ 語(yǔ)法中,類(lèi)的成員函數(shù)可以在聲明的同時(shí)被定義,并且自動(dòng)成為聯(lián)函數(shù)。這雖然會(huì)帶來(lái)書(shū)寫(xiě)上的方便,但卻造成了風(fēng)格不一致,弊大
38、于利。建議將成員函數(shù)的定義與聲明分開(kāi),不管該函數(shù)體有多么小?!窘ㄗh1-2-2】不提倡使用全局變量,盡量不要在頭文件中出現(xiàn)象e*tern int value 這類(lèi)聲明。/ 和版本聲明見(jiàn)例如1-1,此處省略。#ifndefGRAPHICS_H/ 防止graphics.h被重復(fù)引用#defineGRAPHICS_H#include / 引用標(biāo)準(zhǔn)庫(kù)的頭文件#include myheader.h / 引用非標(biāo)準(zhǔn)庫(kù)的頭文件void Function1();/ 全局函數(shù)聲明class Bo* / 類(lèi)構(gòu)造聲明;#endif例如1-2 C+/C頭文件的構(gòu)造1.3 定義文件的構(gòu)造定義文件有三局部容:1定義文件開(kāi)頭
39、處的和版本聲明參見(jiàn)例如1-1。2對(duì)一些頭文件的引用。3程序的實(shí)現(xiàn)體包括數(shù)據(jù)和代碼。假設(shè)定義文件的名稱(chēng)為 graphics.cpp,定義文件的構(gòu)造參見(jiàn)例如1-3。/ 和版本聲明見(jiàn)例如1-1,此處省略。#include graphics.h/ 引用頭文件/ 全局函數(shù)的實(shí)現(xiàn)體void Function1()/ 類(lèi)成員函數(shù)的實(shí)現(xiàn)體void Bo*:Draw()例如1-3 C+/C定義文件的構(gòu)造1.4 頭文件的作用早期的編程語(yǔ)言如Basic、Fortran沒(méi)有頭文件的概念,C+/C語(yǔ)言的初學(xué)者雖然會(huì)用使用頭文件,但常常不明其理。這里對(duì)頭文件的作用略作解釋?zhuān)?通過(guò)頭文件來(lái)調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便
40、或不準(zhǔn)向用戶(hù)公布,只要向用戶(hù)提供頭文件和二進(jìn)制的庫(kù)即可。用戶(hù)只需要按照頭文件中的接口聲明來(lái)調(diào)用庫(kù)功能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼。2頭文件能加強(qiáng)類(lèi)型平安檢查。如果*個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的負(fù)擔(dān)。1.5 目錄構(gòu)造如果一個(gè)軟件的頭文件數(shù)目比擬多如超過(guò)十個(gè),通常應(yīng)將頭文件和定義文件分別保存于不同的目錄,以便于維護(hù)。例如可將頭文件保存于include目錄,將定義文件保存于source目錄可以是多級(jí)目錄。如果*些頭文件是私有的,它不會(huì)被用戶(hù)的程序直接引用,則沒(méi)有必要公開(kāi)其聲明。為了加強(qiáng)
41、信息隱藏,這些私有的頭文件可以和定義文件存放于同一個(gè)目錄。第2章程序的版式版式雖然不會(huì)影響程序的功能,但會(huì)影響可讀性。程序的版式追求清晰、美觀,是程序風(fēng)格的重要構(gòu)成因素。可以把程序的版式比喻為書(shū)法。好的書(shū)法可讓人對(duì)程序一目了然,看得興致勃勃。差的程序書(shū)法如螃蟹爬行,讓人看得索然無(wú)味,更令維護(hù)者煩惱有加。請(qǐng)程序員們學(xué)習(xí)程序的書(shū)法,彌補(bǔ)大學(xué)計(jì)算機(jī)教育的漏洞,實(shí)在很有必要。2.1 空行空行起著分隔程序段落的作用??招械皿w不過(guò)多也不過(guò)少將使程序的布局更加清晰。空行不會(huì)浪費(fèi)存,雖然打印含有空行的程序是會(huì)多消耗一些紙,但是值得。所以不要舍不得用空行。【規(guī)則2-1-1】在每個(gè)類(lèi)聲明之后、每個(gè)函數(shù)定義完畢之后
42、都要加空行。參見(jiàn)例如2-1a【規(guī)則2-1-2】在一個(gè)函數(shù)體,邏揖上密切相關(guān)的語(yǔ)句之間不加空行,其它地方應(yīng)加空行分隔。參見(jiàn)例如2-1b / 空行void Function1()/ 空行void Function2()/ 空行void Function3()/ 空行while (condition)statement1;/ 空行if (condition) statement2;elsestatement3;/ 空行statement4; 例如2-1(a) 函數(shù)之間的空行 例如2-1(b) 函數(shù)部的空行2.2 代碼行【規(guī)則2-2-1】一行代碼只做一件事情,如只定義一個(gè)變量,或只寫(xiě)一條語(yǔ)句。這樣的代
43、碼容易閱讀,并且方便于寫(xiě)注釋?!疽?guī)則2-2-2】if、for、while、do等語(yǔ)句自占一行,執(zhí)行語(yǔ)句不得緊跟其后。不管執(zhí)行語(yǔ)句有多少都要加。這樣可以防止書(shū)寫(xiě)失誤。例如2-2a為風(fēng)格良好的代碼行,例如2-2b為風(fēng)格不良的代碼行。int width;/ 寬度int height;/ 高度int depth;/ 深度int width, height, depth; / 寬度高度深度* = a + b;y = c + d;z = e + f;* a + b; y = c + d; z = e + f;if (width height) dosomething();if (width =、=、+、*
44、、%、&、|、這類(lèi)操作符前后不加空格。【建議2-3-1】對(duì)于表達(dá)式比擬長(zhǎng)的for語(yǔ)句和if語(yǔ)句,為了緊湊起見(jiàn)可以適當(dāng)?shù)厝サ粢恍┛崭瘢鏵or (i=0; i10; i+)和if (a=b) & (c= 2000) / 良好的風(fēng)格if(year=2000) / 不良的風(fēng)格if (a=b) & (c=b&c=d) / 不良的風(fēng)格for (i=0; i10; i+) / 良好的風(fēng)格for(i=0;i10;i+) / 不良的風(fēng)格for (i = 0; I 10; i +) / 過(guò)多的空格* = a b a : b; / 良好的風(fēng)格*=aFunction(); / 不要寫(xiě)成 b - Function()
45、;例如2-3 代碼行的空格2.4 對(duì)齊【規(guī)則2-4-1】程序的分界符和應(yīng)獨(dú)占一行并且位于同一列,同時(shí)與引用它們的語(yǔ)句左對(duì)齊?!疽?guī)則2-4-2】 之的代碼塊在右邊數(shù)格處左對(duì)齊。例如2-4a為風(fēng)格良好的對(duì)齊,例如2-4b為風(fēng)格不良的對(duì)齊。void Function(int *) / program codevoid Function(int *) / program codeif (condition) / program codeelse / program codeif (condition) / program codeelse / program codefor (initializati
46、on; condition; update) / program codefor (initialization; condition; update) / program codeWhile (condition) / program codewhile (condition) / program code如果出現(xiàn)嵌套的,則使用縮進(jìn)對(duì)齊,如: 例如2-4(a) 風(fēng)格良好的對(duì)齊 例如2-4(b) 風(fēng)格不良的對(duì)齊2.5 長(zhǎng)行拆分【規(guī)則2-5-1】代碼行最大長(zhǎng)度宜控制在70至80個(gè)字符以。代碼行不要過(guò)長(zhǎng),否則眼睛看不過(guò)來(lái),也不便于打印?!疽?guī)則2-5-2】長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處拆分成新行,操作
47、符放在新行之首以便突出操作符。拆分出的新行要進(jìn)展適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。if (very_longer_variable1 = very_longer_variable12)& (very_longer_variable3 = very_longer_variable14)& (very_longer_variable5 Draw();/ 類(lèi)的成員函數(shù)【規(guī)則3-1-8】用正確的反義詞組命名具有互斥意義的變量或相反動(dòng)作的函數(shù)等。例如:intminValue;intma*Value;intSetValue();intGetValue();【建議3-1-1】盡量防止名字中出現(xiàn)數(shù)字編號(hào),如V
48、alue1,Value2等,除非邏輯上確實(shí)需要編號(hào)。這是為了防止程序員偷懶,不肯為命名動(dòng)腦筋而導(dǎo)致產(chǎn)生無(wú)意義的名字因?yàn)橛脭?shù)字編號(hào)最省事。3.2 簡(jiǎn)單的Windows應(yīng)用程序命名規(guī)則作者對(duì)匈牙利命名規(guī)則做了合理的簡(jiǎn)化,下述的命名規(guī)則簡(jiǎn)單易用,比擬適合于Windows應(yīng)用軟件的開(kāi)發(fā)。【規(guī)則3-2-1】類(lèi)名和函數(shù)名用大寫(xiě)字母開(kāi)頭的單詞組合而成。例如:class Node;/ 類(lèi)名class LeafNode;/ 類(lèi)名void Draw(void);/ 函數(shù)名void SetValue(int value);/ 函數(shù)名【規(guī)則3-2-2】變量和參數(shù)用小寫(xiě)字母開(kāi)頭的單詞組合而成。例如:BOOL flag;
49、int drawMode;【規(guī)則3-2-3】常量全用大寫(xiě)的字母,用下劃線(xiàn)分割單詞。例如:const int MA* = 100;const int MA*_LENGTH = 100;【規(guī)則3-2-4】靜態(tài)變量加前綴s_表示static。例如:void Init()static int s_initValue;/ 靜態(tài)變量【規(guī)則3-2-5】如果不得已需要全局變量,則使全局變量加前綴g_表示global。例如:int g_howManyPeople;/ 全局變量int g_howMuchMoney;/ 全局變量【規(guī)則3-2-6】類(lèi)的數(shù)據(jù)成員加前綴m_表示member,這樣可以防止數(shù)據(jù)成員與成員函數(shù)
50、的參數(shù)同名。例如:void Object:SetValue(int width, int height)m_width = width;m_height = height;【規(guī)則3-2-7】為了防止*一軟件庫(kù)中的一些標(biāo)識(shí)符和其它軟件庫(kù)中的沖突,可以為各種標(biāo)識(shí)符加上能反映軟件性質(zhì)的前綴。例如三維圖形標(biāo)準(zhǔn)OpenGL的所有庫(kù)函數(shù)均以gl開(kāi)頭,所有常量或宏定義均以GL開(kāi)頭。3.3 簡(jiǎn)單的Uni*應(yīng)用程序命名規(guī)則第4章表達(dá)式和根本語(yǔ)句讀者可能疑心:連if、for、while、goto、switch這樣簡(jiǎn)單的東西也要探討編程風(fēng)格,是不是小題大做?我真的覺(jué)察很多程序員用隱含錯(cuò)誤的方式寫(xiě)表達(dá)式和根本語(yǔ)句,我
51、自己也犯過(guò)類(lèi)似的錯(cuò)誤。表達(dá)式和語(yǔ)句都屬于C+/C的短語(yǔ)構(gòu)造語(yǔ)法。它們看似簡(jiǎn)單,但使用時(shí)隱患比擬多。本章歸納了正確使用表達(dá)式和語(yǔ)句的一些規(guī)則與建議。4.1 運(yùn)算符的優(yōu)先級(jí)C+/C語(yǔ)言的運(yùn)算符有數(shù)十個(gè),運(yùn)算符的優(yōu)先級(jí)與結(jié)合律如表4-1所示。注意一元運(yùn)算符 + - * 的優(yōu)先級(jí)高于對(duì)應(yīng)的二元運(yùn)算符。優(yōu)先級(jí)運(yùn)算符結(jié)合律從高到低排列( ) - .從左至右! + - 類(lèi)型 sizeof+ - * &從右至左* / %從左至右+ -從左至右從左至右 =從左至右= !=從左至右&從左至右從左至右|從左至右&從左至右|從右至左:從右至左= += -= *= /= %= &= =|= =從左至右表4-1 運(yùn)算符的
52、優(yōu)先級(jí)與結(jié)合律【規(guī)則4-1-1】如果代碼行中的運(yùn)算符比擬多,用括號(hào)確定表達(dá)式的操作順序,防止使用默認(rèn)的優(yōu)先級(jí)。由于將表4-1熟記是比擬困難的,為了防止產(chǎn)生歧義并提高可讀性,應(yīng)當(dāng)用括號(hào)確定表達(dá)式的操作順序。例如:word = (high = b & c d & c + f = g + h ;/ 復(fù)合表達(dá)式過(guò)于復(fù)雜【規(guī)則4-2-2】不要有多用途的復(fù)合表達(dá)式。例如:d = (a = b + c) + r ; 該表達(dá)式既求a值又求d值。應(yīng)該拆分為兩個(gè)獨(dú)立的語(yǔ)句:a = b + c;d = a + r;【規(guī)則4-2-3】不要把程序中的復(fù)合表達(dá)式與真正的數(shù)學(xué)表達(dá)式混淆。例如:if (a b c)/ a b
53、 c是數(shù)學(xué)表達(dá)式而不是程序表達(dá)式并不表示if (ab) & (bc)而是成了令人費(fèi)解的if ( (ab)=或=-EPSINON) & (*=EPSINON)其中EPSINON是允許的誤差即精度。4.3.4 指針變量與零值比擬【規(guī)則4-3-4】應(yīng)當(dāng)將指針變量用=或!=與NULL比擬。指針變量的零值是空記為NULL。盡管NULL的值與0一樣,但是兩者意義不同。假設(shè)指針變量的名字為p,它與零值比擬的標(biāo)準(zhǔn)if語(yǔ)句如下:if (p = NULL)/ p與NULL顯式比擬,強(qiáng)調(diào)p是指針變量if (p != NULL)不要寫(xiě)成if (p = 0) / 容易讓人誤解p是整型變量if (p != 0) 或者if
54、 (p)/ 容易讓人誤解p是布爾變量if (!p)4.3.5 對(duì)if語(yǔ)句的補(bǔ)充說(shuō)明有時(shí)候我們可能會(huì)看到 if (NULL = p) 這樣乖僻的格式。不是程序?qū)戝e(cuò)了,是程序員為了防止將 if (p = NULL) 誤寫(xiě)成 if (p = NULL),而有意把p和NULL顛倒。編譯器認(rèn)為 if (p = NULL) 是合法的,但是會(huì)指出 if (NULL = p)是錯(cuò)誤的,因?yàn)镹ULL不能被賦值。程序中有時(shí)會(huì)遇到if/else/return的組合,應(yīng)該將如下不良風(fēng)格的程序if (condition)return *;return y;改寫(xiě)為if (condition)return *;elsere
55、turn y;或者改寫(xiě)成更加簡(jiǎn)練的 return (condition * : y);4.4 循環(huán)語(yǔ)句的效率C+/C循環(huán)語(yǔ)句中,for語(yǔ)句使用頻率最高,while語(yǔ)句其次,do語(yǔ)句很少用。本節(jié)重點(diǎn)論述循環(huán)體的效率。提高循環(huán)體效率的根本方法是降低循環(huán)體的復(fù)雜性?!窘ㄗh4-4-1】在多重循環(huán)中,如果有可能,應(yīng)當(dāng)將最長(zhǎng)的循環(huán)放在最層,最短的循環(huán)放在最外層,以減少CPU跨切循環(huán)層的次數(shù)。例如例如4-4(b)的效率比例如4-4(a)的高。for (row=0; row100; row+)for ( col=0; col5; col+ )sum = sum + arowcol;for (col=0; co
56、l5; col+ )for (row=0; row100; row+) sum = sum + arowcol;例如4-4(a) 低效率:長(zhǎng)循環(huán)在最外層 例如4-4(b) 高效率:長(zhǎng)循環(huán)在最層【建議4-4-2】如果循環(huán)體存在邏輯判斷,并且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)體的外面。例如4-4(c)的程序比例如4-4(d)多執(zhí)行了N-1次邏輯判斷。并且由于前者老要進(jìn)展邏輯判斷,打斷了循環(huán)流水線(xiàn)作業(yè),使得編譯器不能對(duì)循環(huán)進(jìn)展優(yōu)化處理,降低了效率。如果N非常大,最好采用例如4-4(d)的寫(xiě)法,可以提高效率。如果N非常小,兩者效率差異并不明顯,采用例如4-4(c)的寫(xiě)法比擬好,因?yàn)槌绦蚋雍?jiǎn)潔。for
57、 (i=0; iN; i+)if (condition) DoSomething();else DoOtherthing();if (condition)for (i=0; iN; i+) DoSomething();else for (i=0; iN; i+) DoOtherthing();表4-4(c) 效率低但程序簡(jiǎn)潔 表4-4(d) 效率高但程序不簡(jiǎn)潔4.5 for 語(yǔ)句的循環(huán)控制變量【規(guī)則4-5-1】不可在for 循環(huán)體修改循環(huán)變量,防止for 循環(huán)失去控制?!窘ㄗh4-5-1】建議for語(yǔ)句的循環(huán)控制變量的取值采用半開(kāi)半閉區(qū)間寫(xiě)法。例如4-5(a)中的*值屬于半開(kāi)半閉區(qū)間0 = *
58、N,起點(diǎn)到終點(diǎn)的間隔為N,循環(huán)次數(shù)為N。例如4-5(b)中的*值屬于閉區(qū)間0 = * = N-1,起點(diǎn)到終點(diǎn)的間隔為N-1,循環(huán)次數(shù)為N。相比之下,例如4-5(a)的寫(xiě)法更加直觀,盡管兩者的功能是一樣的。for (int *=0; *N; *+)for (int *=0; * 0 )*pbTo + = *pbFrom + ;return pvTo;例如6-5 復(fù)制不重疊的存塊assert不是一個(gè)倉(cāng)促拼湊起來(lái)的宏。為了不在程序的Debug版本和Release版本引起差異,assert不應(yīng)該產(chǎn)生任何副作用。所以assert不是函數(shù),而是宏。程序員可以把a(bǔ)ssert看成一個(gè)在任何系統(tǒng)狀態(tài)下都可以平安
59、使用的無(wú)害測(cè)試手段。如果程序在assert處終止了,并不是說(shuō)含有該assert的函數(shù)有錯(cuò)誤,而是調(diào)用者出了過(guò)失,assert可以幫助我們找到發(fā)生錯(cuò)誤的原因。很少有比跟蹤到程序的斷言,卻不知道該斷言的作用更讓人沮喪的事了。你化了很多時(shí)間,不是為了排除錯(cuò)誤,而只是為了弄清楚這個(gè)錯(cuò)誤到底是什么。有的時(shí)候,程序員偶爾還會(huì)設(shè)計(jì)出有錯(cuò)誤的斷言。所以如果搞不清楚斷言檢查的是什么,就很難判斷錯(cuò)誤是出現(xiàn)在程序中,還是出現(xiàn)在斷言中。幸運(yùn)的是這個(gè)問(wèn)題很好解決,只要加上清晰的注釋即可。這本是顯而易見(jiàn)的事情,可是很少有程序員這樣做。這好比一個(gè)人在森林里,看到樹(shù)上釘著一塊危險(xiǎn)的大牌子。但危險(xiǎn)到底是什么?樹(shù)要倒?有廢井?有
60、野獸?除非告訴人們危險(xiǎn)是什么,否則這個(gè)警告牌難以起到積極有效的作用。難以理解的斷言常常被程序員忽略,甚至被刪除。Maguire, p8-p30【規(guī)則6-5-1】使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯(cuò)誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的?!疽?guī)則6-5-2】在函數(shù)的入口處,使用斷言檢查參數(shù)的有效性合法性?!窘ㄗh6-5-1】在編寫(xiě)函數(shù)時(shí),要進(jìn)展反復(fù)的考察,并且自問(wèn):我打算做哪些假定?一旦確定了的假定,就要使用斷言對(duì)假定進(jìn)展檢查?!窘ㄗh6-5-2】一般教科書(shū)都鼓勵(lì)程序員們進(jìn)展防錯(cuò)設(shè)計(jì),但要記住這種編程風(fēng)格可能會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)展防錯(cuò)設(shè)計(jì)時(shí),如果不可能發(fā)生的事情確實(shí)發(fā)生
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版實(shí)習(xí)合同模板:實(shí)習(xí)期間實(shí)習(xí)成果轉(zhuǎn)化3篇
- 2025版木結(jié)構(gòu)景觀清包施工合同示范文本4篇
- 二零二五年度虛擬現(xiàn)實(shí)內(nèi)容創(chuàng)作者免責(zé)聲明合同范本4篇
- 2025版小型沼氣項(xiàng)目設(shè)備研發(fā)、生產(chǎn)、安裝及運(yùn)營(yíng)維護(hù)合同3篇
- 增值稅及其會(huì)計(jì)處理教學(xué)課件
- 2025版新能源汽車(chē)動(dòng)力電池回收利用合同范本4篇
- 2025版小麥種子市場(chǎng)調(diào)研與風(fēng)險(xiǎn)評(píng)估合同2篇
- 2025版學(xué)校臨時(shí)教師聘用合同實(shí)施細(xì)則3篇
- 二零二五版幕墻工程風(fēng)險(xiǎn)管理與保險(xiǎn)合同4篇
- 體育設(shè)施工程體育場(chǎng)地圍網(wǎng)施工考核試卷
- 定額〔2025〕1號(hào)文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 【教案】+同一直線(xiàn)上二力的合成(教學(xué)設(shè)計(jì))(人教版2024)八年級(jí)物理下冊(cè)
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級(jí)上學(xué)期期末質(zhì)量檢測(cè)數(shù)學(xué)試卷(含解析)
- 單位往個(gè)人轉(zhuǎn)賬的合同(2篇)
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國(guó)式摔跤課程學(xué)生運(yùn)動(dòng)能力測(cè)評(píng)規(guī)范
- 高危妊娠的評(píng)估和護(hù)理
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 兒童10歲生日-百日宴-滿(mǎn)月酒生日會(huì)成長(zhǎng)相冊(cè)展示(共二篇)
- 2023年高考全國(guó)甲卷數(shù)學(xué)(理)試卷【含答案】
評(píng)論
0/150
提交評(píng)論