C語言深度解剖解開程序員面試筆試的秘密以含金量勇敢挑課件_第1頁
C語言深度解剖解開程序員面試筆試的秘密以含金量勇敢挑課件_第2頁
C語言深度解剖解開程序員面試筆試的秘密以含金量勇敢挑課件_第3頁
C語言深度解剖解開程序員面試筆試的秘密以含金量勇敢挑課件_第4頁
C語言深度解剖解開程序員面試筆試的秘密以含金量勇敢挑課件_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C 語言深度解剖-解開程序員面試筆試的秘密以含金量勇敢挑戰(zhàn)國內(nèi)外同類書籍陳正沖石 虎編著審閱第1頁,共131頁。版權(quán)申明本書尚未出版,先放到網(wǎng)上給大家免費下載和閱覽。本書正式出版前讀者可以仔細(xì)研讀和自由傳閱本書電子版,但不允許私自大量印刷和銷售。出版社如想出版此書可通過郵件或博客留言聯(lián)系作者商談出版事宜。對于非法盜印或盜版,作者將本著愚公移山的精神,孜孜不倦的與盜版者周旋,直至法律做出公正的裁決。第2頁,共131頁。,寫在前言前面的話最近面試了一些人,包括應(yīng)屆本科、碩士和工作多年的程序員,在問到 C 語言相關(guān)的問題的時候,總是沒幾個人能完全答上我的問題。甚至一些工作多年,簡歷上寫著“最得意的語

2、言是 C 語言”“對C 有很深的研究”“精通 C 語言”的人也答不完全我的問題,甚至有個別人我問的問題一個都答不上。于是我就想起了我去年閑的使用寫的這本小冊子。這本小冊子已經(jīng)在我電腦里睡了一年大覺了。并非沒有出版社愿意出版,而是幾個大的出版社都認(rèn)為書寫得不錯,但太薄,利潤太低,所以要求我加厚到 300 頁以上。我拒絕加厚,并為此和幾個出版社僵持了一年多。我認(rèn)為經(jīng)典的東西一定要精煉,不要廢話。這次由于面試別人,所以終于記起了我還寫過這么一本小冊子。想了想,還是決定掛到網(wǎng)上免費讓大家看得了。并為此專門為本書開了個博客,以方便和讀者交流。博客地址:/dissection_c作者簡介:陳正沖:湖南沅江

3、人,畢業(yè)于長春光學(xué)精密機(jī)械學(xué)院(長春理工大學(xué))數(shù)學(xué)系。目前從事嵌入式軟件開發(fā)和管理方面的工作。石虎:湖南沅江人,畢業(yè)于吉林大學(xué)計算機(jī)系。目前為大連交通大學(xué)計算機(jī)系講師。第3頁,共131頁。前言我遇到過很多程序員和計算機(jī)系畢業(yè)的學(xué)生,也給很多程序員和計算機(jī)系畢業(yè)的學(xué)生講解過高級 C 語言程序設(shè)計。每期班開課前,我總會問學(xué)生:你感覺 C 語言學(xué)得怎么樣?難嗎?指針明白嗎?數(shù)組呢?內(nèi)存管理呢?往往學(xué)生回答說:感覺還可以,C 語言不難,指針很明白,數(shù)組很簡單,內(nèi)存管理也不難。一般我會再問一個問題:通過這個班的學(xué)習(xí),你想達(dá)到什么程度?很多學(xué)生回答:精通 C 語言。我告訴他們:我很無奈,也很無語。因為我完

4、全在和一群業(yè)余者或者是 C 語言愛好者在對話。你們大學(xué)的計算機(jī)教育根本就是在浪費你們的時間,念了幾年大學(xué),連 C 語言的門都沒摸著?,F(xiàn)在大多數(shù)學(xué)校計算機(jī)系都開了 C、C+、Java、C#等等語言,好像什么都學(xué)了,但是什么都不會,更可悲的是有些大學(xué)居然取消了 C 語言課程,認(rèn)為其過時了。我個人的觀點是“十鳥在林,不如一鳥在手”,真正把 C 語言整明白了再學(xué)別的語言也很簡單,如果 C 語言都沒整明白,別的語言學(xué)得再好也是花架子,因為你并不了解底層是怎么回事。當(dāng)然我也從來不認(rèn)為一個沒學(xué)過匯編的人能真正掌握 C 語言的真諦。我個人一直認(rèn)為,普通人用 C 語言在 3 年之下,一般來說,還沒掌握 C 語言

5、;5 年之下,一般來說還沒熟悉 C 語言;10 年之下,談不上精通。所以,我告訴我的學(xué)生:聽完我的課,遠(yuǎn)達(dá)不到精通的目標(biāo),熟悉也達(dá)不到,掌握也達(dá)不到。那能達(dá)到什么目標(biāo)?-領(lǐng)你們進(jìn)入 C 語言的大門。入門之后的造化如何在于你們自己。不過我可以告訴你們一條不是捷徑的捷徑:把一個鍵盤的 F10 或 F11 按壞,當(dāng)然不能是垃圾鍵盤。往往講到這里,學(xué)生眼里總是透露著疑慮。C 語言有這么難嗎?我的回答是:不難。但你就是用不明白。學(xué)生說:以前大學(xué)老師講 C 語言,我學(xué)得很好。老師講的都能聽懂,考試也很好。平時練習(xí)感覺自己還不錯,工作也很輕松找到了。我告訴學(xué)生:聽明白,看明白不代表你懂了,你懂了不代表你會用

6、了,你會用了不代表你能用明白,你能用明白不代表你真正懂了!什么時候表明你真正懂了呢?你站在我這來,把問題給下面的同學(xué)講明白,學(xué)生都聽明白了,說明你真正懂了。否則,你就沒真正懂,這是檢驗懂沒懂的唯一標(biāo)準(zhǔn)。冰山大家都沒見過,但總聽過或是電影里看過吧?如果你連泰坦尼克都沒看過,那你也算個人物(開個玩笑)泰坦尼克里的冰山給泰坦尼克造成了巨大的損失。你們都是理工科的,應(yīng)該明白冰山在水面上的部分只是總個冰山的 1/8。我現(xiàn)在就告訴你們,C 語言就是這座冰山。你們現(xiàn)在僅僅是摸到了水面上的部分,甚至根本不知道水面下的部分。我希望通過我的講解,讓你們摸到水面下的部分,讓你們知道 C 語言到底是什么樣子。從現(xiàn)在開

7、始,除非在特殊情況下,不允許用 printf 這個函數(shù)。為什么呢?很多學(xué)生寫完代碼,直接用 printf 打印出來,發(fā)現(xiàn)結(jié)果不對。然后就舉手問我:老師,我的結(jié)果為什么不對???連調(diào)試的意識都沒有!大多數(shù)學(xué)生根本就不會調(diào)試,不會看變量的值,內(nèi)存的值。只知道 printf 出來結(jié)果不對,卻不知道為什么不對,怎么解決。這種情況還算好的。往往很多時候 printf 出來的結(jié)果是對的,然后呢,學(xué)生也理所當(dāng)然的認(rèn)為程序沒有問題。是這樣嗎?往往不是,往后看,你能看到例子的。永遠(yuǎn)給我記住一點:結(jié)果對,并不代表程序真正沒有問題。所以,以后盡量不要用 printf 函數(shù),要去看變量的值,內(nèi)存的值。當(dāng)然,在我們目前的

8、編譯器里,變量的值,內(nèi)存的值對了就代表你程序沒問題嗎?也不是,往后,你也會看到例子的。這個時候呢,學(xué)生往往會莫名其妙。這個老師有問題吧。大學(xué)里我們老師都教我們怎么用 printf,告訴我們要經(jīng)常用 printf。這也恰恰是大學(xué)教育失敗的地方之一。很多大學(xué)老師根本就沒真正用 C 語言寫過幾行代碼,更別說教學(xué)生調(diào)試代碼了。不調(diào)試代碼,不按 F10 或F11,水平永遠(yuǎn)也無法提上來,所以,要想學(xué)好一門編程語言,最好的辦法就是多調(diào)試。你去一個軟件公司轉(zhuǎn)轉(zhuǎn),去看人家的鍵盤,如果發(fā)現(xiàn)鍵盤上的 F10 或 F11 錚亮錚亮,毫無疑問,此機(jī)的主人曾經(jīng)或現(xiàn)在是開發(fā)人員(這里僅指寫代碼的,不上升到架構(gòu)設(shè)計類的開發(fā)人

9、員),第4頁,共131頁。否則,必是非開發(fā)人員。非常有必要申明,本人并非什么學(xué)者或是專家,但本人是數(shù)學(xué)系畢業(yè),所以對理論方面比較擅長。講解的時候會舉很多例子來盡量使學(xué)生明白這個知識點,至于這些例子是否恰當(dāng)則是見仁見智的問題了。但是一條,長期的數(shù)學(xué)訓(xùn)練使得本人思維比較嚴(yán)謹(jǐn),講解一些知識點尤其是一些概念性原理性的東西時會摳的很細(xì)、很嚴(yán),這一點相信讀者會體會得到的。本書是我平時講解 C 語言的一些心得和經(jīng)驗,其中有很多我個人的見解或看法。經(jīng)過多期培訓(xùn)班的實踐,發(fā)現(xiàn)這樣講解得比較透徹,學(xué)生聽得明白。很多學(xué)生聽完課后告訴我:我有生以來聽課從來都沒有聽得這么透徹,這么明白過。也有業(yè)余班的學(xué)生甚至辭掉本職工

10、作來聽我的課的。當(dāng)然,關(guān)于 C 語言的這么多經(jīng)驗和心得的積累并非我一人之力。借用一句名言:我只不過是站在巨人的肩膀上而已。給學(xué)生做培訓(xùn)的時候我參考得比較多的書有:Kernighan &Ritchie 的The C Programming Language;Linden 的Expert C Programming; Andrew &KoeningC Traps and Pitfalls; Steve Maguire 的Write Clean Code;Steve McConnell 的Code Complete. Second Edition;林銳的高質(zhì)量 C+/C 編程指南。這些書都是經(jīng)典之作

11、,但卻都有著各自的缺陷。讀者往往需要同時閱讀這些書才能深刻的掌握某一知識點。我的講課的試圖時候融各家之長,再加上我個人的見解傳授給學(xué)生。還好,學(xué)生反映還可以,至少還沒有出亂子。這些書飽含著作者的智慧,每讀一遍都有不同的收獲,我希望讀者能讀上十遍。另外,在編寫本書時也參考了網(wǎng)上一些無名高手的文章,這些高手的文章見解深刻,使我受益匪淺。這里要感謝這些大師們,如果不是他們,肯怕我的 C 語言的水平也僅僅是入門而已。學(xué)習(xí) C 語言,這幾本書如果真正啃透了,水平不會差到哪。與其說本書是我授課的經(jīng)驗與心得,不如說本書是我對這些大師們智慧的解讀。本書并不是從頭到尾講解 C 語言的基礎(chǔ)知識,所以,本書并不適用

12、于 C 語言零基礎(chǔ)的人。本書的知識要比一般的 C 語言書說講的深的多,其中有很多問題是各大公司的面試或筆試題。所以本書的讀者應(yīng)該是中國廣大的計算機(jī)系的學(xué)生和初級程序員。如果本書上面的問題能真正明白 80%,作為一個應(yīng)屆畢業(yè)生,肯怕沒有一家大公司會拒絕你。當(dāng)然,書內(nèi)很多知識也值得計算機(jī)教師或是中高級程序員參考。尤其書內(nèi)的一些例子或比方,如果能被廣大教師用于課堂,我想對學(xué)生來說是件非常好的事情。有人說電影是一門遺憾的藝術(shù),因為在編輯完成之后總能或多或少的發(fā)現(xiàn)一些本來可以做得更好的缺陷。講課同樣也如此,每次講完課之后總能發(fā)現(xiàn)自己某些地方或是沒有講到,或是沒能講透徹或是忘了舉一個輕淺的例子等等。整理本

13、書的過程也是,為了盡量精煉,總是猶豫一些東西的去留。限于作者水平,書中難免有些遺漏甚至錯誤,希望各位讀者能予指教。作者 Mail:dissection_.陳正沖2008 年 6 月 23 日第5頁,共131頁。目錄第一章 關(guān)鍵字. 91.1,最寬恒大量的關(guān)鍵字-auto.111.2,最快的關(guān)鍵字- register. 111.2.1,皇帝身邊的小太監(jiān)-寄存器. 111.2.2,使用 register 修飾符的注意點.111.3,最名不符實的關(guān)鍵字-static.121.3.1,修飾變量.121.3.2,修飾函數(shù).131.4,基本數(shù)據(jù)類型-short、int、long、char、float、do

14、uble. 131.4.1,數(shù)據(jù)類型與“模子”. 141.4.2,變量的命名規(guī)則.141.5,最冤枉的關(guān)鍵字-sizeof.181.5.1,常年被人誤認(rèn)為函數(shù).181.5.2,sizeof(int)*p 表示什么意思?.181.4,signed、unsigned 關(guān)鍵字.191.6,if、else 組合. 201.6.1,bool 變量與“零值”進(jìn)行比較.201.6.2, float 變量與“零值”進(jìn)行比較.211.6.3,指針變量與“零值”進(jìn)行比較. 211.6.4,else 到底與哪個 if 配對呢?.221.6.5,if 語句后面的分號. 231.6.6,使用 if 語句的其他注意事項.

15、 241.7,switch、case 組合. 241.7.1,不要拿青龍偃月刀去削蘋果. 241.7.2,case 關(guān)鍵字后面的值有什么要求嗎?. 251.7.3,case 語句的排列順序.251.7.4,使用 case 語句的其他注意事項.271.8,do、while、for 關(guān)鍵字. 281.8.1,break 與 continue 的區(qū)別.281.8.2,循環(huán)語句的注意點.291.9,goto 關(guān)鍵字.301.10,void 關(guān)鍵字.311.10.1,void a?.311.10,return 關(guān)鍵字. 341.11,const 關(guān)鍵字也許該被替換為 readolny. 341.11.2

16、,節(jié)省空間,避免不必要的內(nèi)存分配,同時提高效率. 351.12,最易變的關(guān)鍵字-volatile. 361.13,最會帶帽子的關(guān)鍵字-extern. 371.14,struct 關(guān)鍵字. 381.14.1,空結(jié)構(gòu)體多大?.381.14.2,柔性數(shù)組.391.14.3,struct 與 class 的區(qū)別. 401.15,union 關(guān)鍵字.40第6頁,共131頁。1.15.1,大小端模式對 union 類型數(shù)據(jù)的影響. 401.15.2,如何用程序確認(rèn)當(dāng)前系統(tǒng)的存儲模式?. 411.16,enum 關(guān)鍵字. 421.16.1, 枚舉類型的使用方法.431.16.2,枚舉與#define 宏的區(qū)

17、別.431.17,偉大的縫紉師-typedef 關(guān)鍵字. 441.17.1,關(guān)于馬甲的笑話.441.17.2,歷史的誤會-也許應(yīng)該是 typerename. 441.17.3,typedef 與#define 的區(qū)別.451.17.4,#define a int10與 typedef int a10;. 46第二章 符號. 492.1,注釋符號.502.1.1,幾個似非而是的注釋問題.502.1.2,y = x/*p. 512.1.3,怎樣才能寫出出色的注釋.51,安息吧,路德維希.凡.貝多芬. 51,windows 大師們用注釋討論天氣問題.51,出色注釋的基本要求. 522.2,接續(xù)符和轉(zhuǎn)

18、義符.532.3,單引號、雙引號.542.4,邏輯運(yùn)算符.542.5,位運(yùn)算符.552.5.1,左移和右移.552.5.2,0 x012+3 的值為多少?.552.6,花括號. 562.7,+、-操作符.562.7.1,+i+i+i. 572.7.2,貪心法.572.8,2/(-2)的值是多少?.582.9,運(yùn)算符的優(yōu)先級.582.9.1, 運(yùn)算符的優(yōu)先級表.582.9.2,一些容易出錯的優(yōu)先級問題. 60第三章 預(yù)處理. 613.1,宏定義. 623.1.1,數(shù)值宏常量.623.1.2,字符串宏常量.623.1.3,用 define 宏定義注釋符號?. 633.1.4,用 define 宏定

19、義表達(dá)式.633.1.5,宏定義中的空格.643.1.6,#undef.643.2,條件編譯.653.3,文件包含.663.4,#error 預(yù)處理. 663.5,#line 預(yù)處理.67第7頁,共131頁。3.6,#pragma 預(yù)處理.673.6.8,#pragma pack. 69,為什么會有內(nèi)存對齊?. 70,如何避免內(nèi)存對齊的影響. 703.7, #運(yùn)算符. 723.8,#預(yù)算符.72第四章 指針和數(shù)組.744.1,指針. 744.1.1,指針的內(nèi)存布局.744.1.2,“*”與防盜門的鑰匙. 754.1.3,int *p = NULL 和*p = NULL 有什么區(qū)別?. 754.

20、1.4,如何將數(shù)值存儲到指定的內(nèi)存地址. 764.1.5,編譯器的 bug?.774.1.6,如何達(dá)到手中無劍、胸中也無劍的地步. 784.2,數(shù)組. 784.2.1,數(shù)組的內(nèi)存布局.784.2.3,數(shù)組名 a 作為左值和右值的區(qū)別.794.3,指針與數(shù)組之間的恩恩怨怨.804.3.1,以指針的形式訪問和以下標(biāo)的形式訪問. 80,以指針的形式訪問和以下標(biāo)的形式訪問指針. 81,以指針的形式訪問和以下標(biāo)的形式訪問數(shù)組. 814.3.2,a 和&a 的區(qū)別. 814.3.3,指針和數(shù)組的定義與聲明.83,定義為數(shù)組,聲明為指針. 83,定義為指針,聲明為數(shù)組. 854.3.4,指針和數(shù)組的對比.8

21、54.4,指針數(shù)組和數(shù)組指針.864.4.1,指針數(shù)組和數(shù)組指針的內(nèi)存布局. 864.4.3,再論 a 和&a 之間的區(qū)別.874.4.4,地址的強(qiáng)制轉(zhuǎn)換.884.5,多維數(shù)組與多級指針.904.5.1,二維數(shù)組.91,假想中的二維數(shù)組布局. 91,內(nèi)存與尺子的對比.91,&p42 - &a42的值為多少?. 924.5.2,二級指針.93,二級指針的內(nèi)存布局. 934.6,數(shù)組參數(shù)與指針參數(shù).944.6.1,一維數(shù)組參數(shù).94,能否向函數(shù)傳遞一個數(shù)組?. 94,無法向函數(shù)傳遞一個數(shù)組. 964.6.2,一級指針參數(shù).97,能否把指針變量本身傳遞給一個函數(shù). 97,無法把指針變量本身傳遞給一個

22、函數(shù). 98第8頁,共131頁。4.6.3,二維數(shù)組參數(shù)與二維指針參數(shù). 994.7,函數(shù)指針.1004.7.1,函數(shù)指針的定義.1004.7.2,函數(shù)指針的使用.101,函數(shù)指針使用的例子. 101,*(int*)&p -這是什么?. 1024.7.3,(*(void(*) ()0)()-這是什么?. 1024.7.4,函數(shù)指針數(shù)組.1034.7.5,函數(shù)指針數(shù)組的指針.104第五章 內(nèi)存管理.1075.1,什么是野指針.1075.2,棧、堆和靜態(tài)區(qū).1075.3,常見的內(nèi)存錯誤及對策.1085.3.1,指針沒有指向一塊合法的內(nèi)存. 108,結(jié)構(gòu)體成員指針未初始化. 108,沒有為結(jié)構(gòu)體指針

23、分配足夠的內(nèi)存. 109,函數(shù)的入口校驗.1095.3.2,為指針分配的內(nèi)存太小.1105.3.3,內(nèi)存分配成功,但并未初始化.1105.3.4,內(nèi)存越界. 1115.3.5,內(nèi)存泄漏. 111,告老還鄉(xiāng)求良田.112,如何使用 malloc 函數(shù).112,用 malloc 函數(shù)申請 0 字節(jié)內(nèi)存.113,內(nèi)存釋放.113,內(nèi)存釋放之后.1145.3.6,內(nèi)存已經(jīng)被釋放了,但是繼續(xù)通過指針來使用. 114第六章 函數(shù). 1156.1,函數(shù)的由來與好處.1166.2,編碼風(fēng)格. 1166.2,函數(shù)設(shè)計的一般原則和技巧.1216.4,函數(shù)遞歸.1236.4.1,一個簡單但易出錯的遞歸例子. 123

24、6.4.2,不使用任何變量編寫 strlen 函數(shù).124第七章 文件結(jié)構(gòu).1277.1,文件內(nèi)容的一般規(guī)則.1277.2,文件名命名的規(guī)則.130第9頁,共131頁。auto第一章 關(guān)鍵字每次講關(guān)鍵字之前,我總是問學(xué)生:C 語言有多少個關(guān)鍵字?sizeof 怎么用?它是函數(shù)嗎?有些學(xué)生不知道 C 語言有多少個關(guān)鍵字,大多數(shù)學(xué)生往往告訴我 sizeof 是函數(shù),因為它后面跟著一對括號。當(dāng)投影儀把這 32 個關(guān)鍵字投到幕布上時,很多學(xué)生表情驚訝。有些關(guān)鍵字從來沒見過,有的驚訝 C 語言關(guān)鍵字竟有 32 個之多。更有甚者,說大學(xué)老師告訴他們 sizeof 是函數(shù),沒想到它居然是關(guān)鍵字!由此可想而知

25、,大學(xué)的計算機(jī)教育是多么失?。”?1.1)C 語言標(biāo)準(zhǔn)定義的 32 個關(guān)鍵字關(guān)鍵字意義聲明自動變量,缺省時編譯器一般默認(rèn)為 autointdoublelongcharfloatshortsignedunsignedstructunionenumstaticswitchcasedefaultbreakregisterconstvolatiletypedef聲明整型變量聲明雙精度變量聲明長整型變量聲明字符型變量聲明浮點型變量聲明短整型變量聲明有符號類型變量聲明無符號類型變量聲明結(jié)構(gòu)體變量聲明聯(lián)合數(shù)據(jù)類型聲明枚舉類型聲明靜態(tài)變量用于開關(guān)語句開關(guān)語句分支開關(guān)語句中的“其他”分支跳出當(dāng)前循環(huán)聲明寄存器變

26、量聲明只讀變量說明變量在程序執(zhí)行中可被隱含地改變用以給數(shù)據(jù)類型取別名(當(dāng)然還有其他作用)第10頁,共131頁。externvoidfor聲明變量是在其他文件正聲明(也可以看做是引用變量)returncontinuedowhileifelsegotosizeof子程序返回語句(可以帶參數(shù),也可不帶參數(shù))聲明函數(shù)無返回值或無參數(shù),聲明空類型指針結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)循環(huán)語句的循環(huán)體循環(huán)語句的循環(huán)條件條件語句條件語句否定分支(與 if 連用)一種循環(huán)語句(可意會不可言傳)無條件跳轉(zhuǎn)語句計算對象所占內(nèi)存空間大小下面的篇幅就一一講解這些關(guān)鍵字。但在講解之前先明確兩個概念:什么是定義?什么是聲明?它

27、們有何區(qū)別?舉個例子:A)int i;B)extern int i;(關(guān)于 extern,后面解釋)哪個是定義?哪個是聲明?或者都是定義或者都是聲明?我所教過的學(xué)生幾乎沒有一人能回答上這個問題。這個十分重要的概念在大學(xué)里從來沒有被提起過!什么是定義:所謂的定義就是(編譯器)創(chuàng)建一個對象,為這個對象分配一塊內(nèi)存并給它取上一個名字,這個名字就是我們經(jīng)常所說的變量名或?qū)ο竺?。但注意,這個名字一旦和這塊內(nèi)存匹配起來(可以想象是這個名字嫁給了這塊空間,沒有要彩禮啊。_),它們就同生共死,終生不離不棄。并且這塊內(nèi)存的位置也不能被改變。一個變量或?qū)ο笤谝欢ǖ膮^(qū)域內(nèi)(比如函數(shù)內(nèi),全局等)只能被定義一次,如果定

28、義多次,編譯器會提示你重復(fù)定義同一個變量或?qū)ο?。什么是聲明:有兩重含義,如下:第一重含義:告訴編譯器,這個名字已經(jīng)匹配到一塊內(nèi)存上了(伊人已嫁,吾將何去何從?何以解憂,唯有稀粥),下面的代碼用到變量或?qū)ο笫窃趧e的地方定義的。聲明可以出現(xiàn)多次。第二重含義:告訴編譯器,我這個名字我先預(yù)定了,別的地方再也不能用它來作為變量名或?qū)ο竺?。比如你在圖書館自習(xí)室的某個座位上放了一本書,表明這個座位已經(jīng)有人預(yù)訂,別人再也不允許使用這個座位。其實這個時候你本人并沒有坐在這個座位上。這種聲明最典型的例子就是函數(shù)參數(shù)的聲明,例如:void fun(int i, char c);好,這樣一解釋,我們可以很清楚的判斷:

29、A)是定義;B)是聲明。那他們的區(qū)別也很清晰了。記住,定義聲明最重要的區(qū)別:定義創(chuàng)建了對象并為這個第11頁,共131頁。對象分配了內(nèi)存,聲明沒有分配內(nèi)存(一個抱伊人,一個喝稀粥。_)。1.1,最寬恒大量的關(guān)鍵字-autoauto:它很寬恒大量的,你就當(dāng)它不存在吧。編譯器在默認(rèn)的缺省情況下,所有變量都是 auto 的。1.2,最快的關(guān)鍵字- registerregister:這個關(guān)鍵字請求編譯器盡可能的將變量存在 CPU 內(nèi)部寄存器中而不是通過內(nèi)存尋址訪問以提高效率。注意是盡可能,不是絕對。你想想,一個 CPU 的寄存器也就那么幾個或幾十個,你要是定義了很多很多 register 變量,它累死也

30、可能不能全部把這些變量放入寄存器吧,輪也可能輪不到你。1.2.1,皇帝身邊的小太監(jiān)-寄存器不知道什么是寄存器?那見過太監(jiān)沒有?沒有?其實我也沒有。沒見過不要緊,見過就麻煩大了。_,大家都看過古裝戲,那些皇帝們要閱讀奏章的時候,大臣總是先將奏章交給皇帝旁邊的小太監(jiān),小太監(jiān)呢再交給皇帝同志處理。這個小太監(jiān)只是個中轉(zhuǎn)站,并無別的功能。好,那我們再聯(lián)想到我們的 CPU。CPU 不就是我們的皇帝同志么?大臣就相當(dāng)于我們的內(nèi)存,數(shù)據(jù)從他這拿出來。那小太監(jiān)就是我們的寄存器了(這里先不考慮 CPU 的高速緩存區(qū))。數(shù)據(jù)從內(nèi)存里拿出來先放到寄存器,然后 CPU 再從寄存器里讀取數(shù)據(jù)來處理,處理完后同樣把數(shù)據(jù)通過

31、寄存器存放到內(nèi)存里,CPU 不直接和內(nèi)存打交道。這里要說明的一點是:小太監(jiān)是主動的從大臣手里接過奏章,然后主動的交給皇帝同志,但寄存器沒這么自覺,它從不主動干什么事。一個皇帝可能有好些小太監(jiān),那么一個 CPU 也可以有很多寄存器,不同型號的 CPU 擁有寄存器的數(shù)量不一樣。為啥要這么麻煩???速度!就是因為速度。寄存器其實就是一塊一塊小的存儲空間,只不過其存取速度要比內(nèi)存快得多。進(jìn)水樓臺先得月嘛,它離 CPU 很近,CPU 一伸手就拿到數(shù)據(jù)了,比在那么大的一塊內(nèi)存里去尋找某個地址上的數(shù)據(jù)是不是快多了?那有人問既然它速度那么快,那我們的內(nèi)存硬盤都改成寄存器得了唄。我要說的是:你真有錢!1.2.2,

32、使用 register 修飾符的注意點雖然寄存器的速度非???,但是使用 register 修飾符也有些限制的:register 變量必須是能被 CPU 寄存器所接受的類型。意味著 register 變量必須是一個單個的值,并且其長度應(yīng)小于或等于整型的長度。 而且 register 變量可能不存放在內(nèi)存中,所以不能用取址運(yùn)算符“&”來獲取 register 變量的地址。第12頁,共131頁。1.3,最名不符實的關(guān)鍵字-static不要誤以為關(guān)鍵字 static 很安靜,其實它一點也不安靜。這個關(guān)鍵字在 C 語言里主要有兩個作用,C+對它進(jìn)行了擴(kuò)展。1.3.1,修飾變量第一個作用:修飾變量。變量又

33、分為局部和全局變量,但它們都存在內(nèi)存的靜態(tài)區(qū)。靜態(tài)全局變量,作用域僅限于變量被定義的文件中,其他文件即使用 extern 聲明也沒法使用他。準(zhǔn)確地說作用域是從定義之處開始,到文件結(jié)尾處結(jié)束,在定義之處前面的那些代碼行也不能使用它。想要使用就得在前面再加 extern *。惡心吧?要想不惡心,很簡單,直接在文件頂端定義不就得了。靜態(tài)局部變量,在函數(shù)體里面定義的,就只能在這個函數(shù)里用了,同一個文檔中的其他函數(shù)也用不了。由于被 static 修飾的變量總是存在內(nèi)存的靜態(tài)區(qū),所以即使這個函數(shù)運(yùn)行結(jié)束,這個靜態(tài)變量的值還是不會被銷毀,函數(shù)下次使用時仍然能用到這個值。static int j;void f

34、un1(void)static int i = 0;i +;void fun2(void)j = 0;j+;int main()for(k=0; k10; k+)fun1();fun2();return 0;第13頁,共131頁。型i 和 j 的值分別是什么,為什么?1.3.2,修飾函數(shù)第二個作用:修飾函數(shù)。函數(shù)前加 static 使得函數(shù)成為靜態(tài)函數(shù)。但此處“static”的含義不是指存儲方式,而是指對函數(shù)的作用域僅局限于本文件(所以又稱內(nèi)部函數(shù))。使用內(nèi)部函數(shù)的好處是:不同的人編寫不同的函數(shù)時,不用擔(dān)心自己定義的函數(shù),是否會與其它文件中的函數(shù)同名。關(guān)鍵字 static 有著不尋常的歷史。起

35、初,在 C 中引入關(guān)鍵字 static 是為了表示退出一個塊后仍然存在的局部變量。隨后,static 在 C 中有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數(shù)。為了避免引入新的關(guān)鍵字,所以仍使用 static 關(guān)鍵字來表示這第二種含義。當(dāng)然,C+里對 static 賦予了第三個作用,這里先不討論,有興趣的可以找相關(guān)資料研究。1.4,基本數(shù)據(jù)類型-short、int、long、char、float、double短整型 shortC 語言包含的數(shù)據(jù)類型如下圖所示:數(shù)值類型整整型 int長整型 long單精度型 float基本類型字符類型 char浮點型雙精度型 double數(shù)組C結(jié)構(gòu)體

36、 struct數(shù)據(jù)類構(gòu)造類型共用體 union枚舉類型 enum型指針類型空類型 void第14頁,共131頁。1.4.1,數(shù)據(jù)類型與“模子”short、int、long、char、float、double 這六個關(guān)鍵字代表 C 語言里的六種基本數(shù)據(jù)類型。怎么去理解它們呢? 舉個例子:見過藕煤球的那個東西吧?(沒見過?煤球總見過吧)。那個東西叫藕煤器,拿著它在和好的煤堆里這么一咔,一個煤球出來了。半徑 12cm,12 個孔。不同型號的藕煤器咔出來的煤球大小不一樣,孔數(shù)也不一樣。這個藕煤器其實就是個模子?,F(xiàn)在我們聯(lián)想一下,short、int、long、char、float、double 這六個東

37、東是不是很像不同類型的藕煤器???拿著它們在內(nèi)存上咔咔咔,不同大小的內(nèi)存就分配好了,當(dāng)然別忘了給它們?nèi)€好聽的名字。在 32 位的系統(tǒng)上 short 咔出來的內(nèi)存大小是 2 個 byte;int 咔出來的內(nèi)存大小是 4 個 byte;long 咔出來的內(nèi)存大小是 4 個 byte;float 咔出來的內(nèi)存大小是 4 個 byte;double 咔出來的內(nèi)存大小是 8 個 byte;char 咔出來的內(nèi)存大小是 1 個 byte。(注意這里指一般情況,可能不同的平臺還會有所不同,具體平臺可以用 sizeof 關(guān)鍵字測試一下)很簡單吧?咔咔咔很爽吧?是很簡單,也確實很爽,但問題就是你咔出來這么多內(nèi)存

38、塊,你總不能給他取名字叫做 x1,x2,x3,x4,x5或者長江 1 號,長江 2 號吧。它們長得這么像(不是你家的老大,老二,老三),過一陣子你就會忘了到底哪個名字和哪個內(nèi)存塊匹配了(到底誰嫁給誰了???_)。所以呢,給他們?nèi)∫粋€好的名字絕對重要。下面我們就來研究研究取什么樣的名字好。1.4.2,變量的命名規(guī)則一般規(guī)則:【規(guī)則 1-1】命名應(yīng)當(dāng)直觀且可以拼讀,可望文知意,便于記憶和閱讀。標(biāo)識符最好采用英文單詞或其組合,不允許使用拼音。程序中的英文單詞一般不要太復(fù)雜,用詞應(yīng)當(dāng)準(zhǔn)確?!疽?guī)則 1-2】命名的長度應(yīng)當(dāng)符合“min-length & max-information”原則。C 是一種簡潔的

39、語言, 命名也應(yīng)該是簡潔的。例如變量名 MaxVal 就比MaxValueUntilOverflow 好用。標(biāo)識符的長度一般不要過長,較長的單詞可通過去掉“元音”形成縮寫。另外,英文詞盡量不縮寫,特別是非常用專業(yè)名詞,如果有縮寫,在同一系統(tǒng)中對同一單詞必須使用相同的表示法,并且注明其意思?!疽?guī)則 1-3】當(dāng)標(biāo)識符由多個詞組成時,每個詞的第一個字母大寫,其余全部小寫。比如:int CurrentVal;這樣的名字看起來比較清晰,遠(yuǎn)比一長串字符好得多?!疽?guī)則 1-4】盡量避免名字中出現(xiàn)數(shù)字編號,如 Value1,Value2 等,除非邏輯上的確需要編號。比如驅(qū)動開發(fā)時為管腳命名,非編號名字反而不好

40、。初學(xué)者總是喜歡用帶編號的變量名或函數(shù)名,這樣子看上去很簡單方便,但其實是一顆顆定時炸彈。這個習(xí)慣初學(xué)者一定要改過來。第15頁,共131頁。sl7u【規(guī)則 1-5】對在多個文件之間共同使用的全局變量或函數(shù)要加范圍限定符(建議使用模塊名(縮寫)作為范圍限定符)。(GUI_ ,etc)標(biāo)識符的命名規(guī)則:【規(guī)則 1-6】標(biāo)識符名分為兩部分:規(guī)范標(biāo)識符前綴(后綴) + 含義標(biāo)識 。非全局變量可以不用使用范圍限定符前綴?!疽?guī)則 1-7】作用域前綴命名規(guī)則。No.123456標(biāo)識符類型Global VariableFile Static Variable(native)Function Static Va

41、riableAuto VariableGlobal FunctionStatic Function作用域前綴gnfagn【規(guī)則 1-8】數(shù)據(jù)類型前綴命名規(guī)則。No.1234PrefixbtbciSuffixData TypebitbooleancharintExampleBit btVariable;boolean bVariable;char cVariable;int iVariable;Remark56shortintlongintunsignedintshortint sVariable;longint lVariable;unsignedint uiVariable;89dfdoub

42、lefloatdouble dVariable;float fVariable;第16頁,共131頁。p2210pointervoid *vpVariable;指針前綴1113141516vstststfpvoidenumstructunionfunctionvoid vVariable;enum A stVariable;struct A stVariable;union A stVariable;void(* fpGetModeFuncList_a)( void )point17_aarray ofchar cVariable_aTABLE_MAX;當(dāng)自定義結(jié)構(gòu)數(shù)據(jù)typedef stru

43、ct SM_EventOpt類型時使用_st 后_sttypedefunsigned char綴;18_pstenum/struct/unionunsigned int當(dāng)自定義結(jié)構(gòu)數(shù)據(jù)charSM_EventOpt_st,*SM_EventOpt_pst;類型為指針類型時使用_pst后綴;【規(guī)則 1-9】含義標(biāo)識命名規(guī)則,變量命名使用名詞性詞組,函數(shù)命名使用動詞性詞組。例如:No1變量名DataGotFromSD目標(biāo)詞Data動詞(的過去分詞)Got狀語From目的地SD含義從 SD 中取得的數(shù)據(jù)DataDeletedFromSDDataDeletedFromSD從 SD 中刪除的數(shù)據(jù)變量含義

44、標(biāo)識符構(gòu)成:目標(biāo)詞 + 動詞(的過去分詞)+ 狀語 + 目的地;N變量名動詞(一般現(xiàn)時)目標(biāo)詞狀語目的地含義o1GetDataFromSDGetDataFromSD從 SD 中取得數(shù)據(jù)DeleteDataFromSDDeleteDataFromSD從 SD 中刪除數(shù)據(jù)第17頁,共131頁。函數(shù)含義標(biāo)識符構(gòu)成:動詞(一般現(xiàn)時)+目標(biāo)詞+狀語+目的地;【規(guī)則 1-10】程序中不得出現(xiàn)僅靠大小寫區(qū)分的相似的標(biāo)識符。例如:int x, X; 變量 x 與 X 容易混淆void foo(int x); 函數(shù) foo 與 FOO 容易混淆void FOO(float x);這里還有一個要特別注意的就是 1

45、(數(shù)字 1)和 l(小寫字母 l)之間,0(數(shù)字 0)和 o(小寫字母 o)之間的區(qū)別。這兩對真是很難區(qū)分的,我曾經(jīng)的一個同事就被這個問題折騰了一次?!疽?guī)則 1-11】一個函數(shù)名禁止被用于其它之處。例如:#include c_standards.hvoid foo(int p_1)int x = p_1;void static_p(void)int foo = 1u;【規(guī)則 1-12】所有宏定義、枚舉常數(shù)、只讀變量全用大寫字母命名,用下劃線分割單詞。例如:const int MAX_LENGTH = 100; /這不是常量,而是一個只讀變量,具體請往后看#define FILE_PATH “/

46、usr/tmp”【規(guī)則 1-13】考慮到習(xí)慣性問題,局部變量中可采用通用的命名方式,僅限于 n、i、j 等作為循環(huán)變量使用。一定不要寫出如下這樣的代碼:int p;char i;int c;char * a;第18頁,共131頁。一般來說習(xí)慣上用 n,m,i,j,k 等表示 int 類型的變量;c,ch 等表示字符類型變量;a 等表示數(shù)組;p 等表示指針。當(dāng)然這僅僅是一般習(xí)慣,除了 i,j,k 等可以用來表示循環(huán)變量外,別的字符變量名盡量不要使用?!疽?guī)則 1-14】定義變量的同時千萬千萬別忘了初始化。定義變量時編譯器并不一定清空了這塊內(nèi)存,它的值可能是無效的數(shù)據(jù)。這個問題在內(nèi)存管理那章有非常詳

47、細(xì)的討論,請參看?!疽?guī)則 1-15】不同類型數(shù)據(jù)之間的運(yùn)算要注意精度擴(kuò)展問題,一般低精度數(shù)據(jù)將向高精度數(shù)據(jù)擴(kuò)展。1.5,最冤枉的關(guān)鍵字-sizeof1.5.1,常年被人誤認(rèn)為函數(shù)sizeof 是關(guān)鍵字不是函數(shù),其實就算不知道它是否為 32 個關(guān)鍵字之一時,我們也可以借助編譯器確定它的身份。看下面的例子:int i=0;A),sizeof(int); B),sizeof(i); C),sizeof int; D),sizeof i;毫無疑問,32 位系統(tǒng)下 A),B)的值為 4。那 C)的呢?D)的呢?在 32 位系統(tǒng)下,通過 Visual C+6.0 或任意一編譯器調(diào)試,我們發(fā)現(xiàn) D)的結(jié)果也

48、為 4。咦?sizeof 后面的括號呢?沒有括號居然也行,那想想,函數(shù)名后面沒有括號行嗎?由此輕易得出 sizeof 絕非函數(shù)。好,再看 C)。編譯器怎么怎么提示出錯呢?不是說 sizeof 是個關(guān)鍵字,其后面的括號可以沒有么?那你想想 sizeof int 表示什么???int 前面加一個關(guān)鍵字?類型擴(kuò)展?明顯不正確,我們可以在 int 前加 unsigned,const 等關(guān)鍵字但不能加 sizeof。好,記住:sizeof 在計算變量所占空間大小時,括號可以省略,而計算類型(模子)大小時不能省略。一般情況下,咱也別偷這個懶,乖乖的寫上括號,繼續(xù)裝作一個“函數(shù)”,做一個“披著函數(shù)皮的關(guān)鍵字”

49、做我的關(guān)鍵字,讓人家認(rèn)為是函數(shù)去吧。1.5.2,sizeof(int)*p 表示什么意思?sizeof(int)*p 表示什么意思?留幾個問題(講解指針與數(shù)組時會詳細(xì)講解),32 位系統(tǒng)下:int *p = NULL;sizeof(p)的值是多少?sizeof(*p)呢?第19頁,共131頁。31 317 732 8int a100;sizeof (a) 的值是多少?sizeof(a100)呢?/請尤其注意本例。sizeof(&a)呢?sizeof(&a0)呢?int b100;void fun(int b100)sizeof(b);/ sizeof (b) 的值是多少?1.4,signed、

50、unsigned 關(guān)鍵字我們知道計算機(jī)底層只認(rèn)識 0、1.任何數(shù)據(jù)到了底層都會變計算轉(zhuǎn)換成 0、1.那負(fù)數(shù)怎么存儲呢?肯定這個“-”號是無法存入內(nèi)存的,怎么辦?很好辦,做個標(biāo)記。把基本數(shù)據(jù)類型的最高位騰出來,用來存符號,同時約定如下:最高位如果是 1,表明這個數(shù)是負(fù)數(shù),其值為除最高位以外的剩余位的值添上這個“-”號;如果最高位是 0,表明這個數(shù)是正數(shù),其值為除最高位以外的剩余位的值。這樣的話,一個 32 位的 signed int 類型整數(shù)其值表示法范圍為:- 2 2 -1;8 位的char 類型數(shù)其值表示的范圍為- 2 2 -1。一個 32 位的 unsigned int 類型整數(shù)其值表示法

51、范圍為:0 2 -1;8 位的 char 類型數(shù)其值表示的范圍為 0 2 -1。同樣我們的 signed 關(guān)鍵字也很寬恒大量,你也可以完全當(dāng)它不存在,編譯器缺省默認(rèn)情況下數(shù)據(jù)為 signed 類型的。上面的解釋很容易理解,下面就考慮一下這個問題:int main()char a1000;int i;for(i=0; i=0;i-)printf(%un,i);1.6,if、else 組合if 語句很簡單吧。嗯,的確很簡單。那我們就簡單的看下面幾個簡單的問題:1.6.1,bool 變量與“零值”進(jìn)行比較bool 變量與“零值”進(jìn)行比較的 if 語句怎么寫?第21頁,共131頁。bool bTest

52、Flag = FALSE;/想想為什么一般初始化為 FALSE 比較好?A), if(bTestFlag = 0);B), if(bTestFlag = TRUE);C), if(bTestFlag);if(bTestFlag = 1);if(bTestFlag = FLASE);if(!bTestFlag);哪一組或是那些組正確呢?我們來分析分析:A)寫法:bTestFlag 是什么?整型變量?如果要不是這個名字遵照了前面的命名規(guī)范,肯怕很容易讓人誤會成整型變量。所以這種寫法不好。B)寫法:FLASE 的值大家都知道,在編譯器里被定義為 0;但 TRUE 的值呢?都是 1嗎?很不幸,不都是

53、1。Visual C+定義為 1,而它的同胞兄弟 Visual Basic 就把 TRUE 定義為-1.那很顯然,這種寫法也不好。大家都知道 if 語句是靠其后面的括號里的表達(dá)式的值來進(jìn)行分支跳轉(zhuǎn)的。表達(dá)式如果為真,則執(zhí)行 if 語句后面緊跟的代碼;否則不執(zhí)行。那顯然,本組的寫法很好,既不會引起誤會,也不會由于 TRUE 或 FLASE 的不同定義值而出錯。記?。阂院髮懘a就得這樣寫。1.6.2, float 變量與“零值”進(jìn)行比較float 變量與“零值”進(jìn)行比較的 if 語句怎么寫?float fTestVal = 0.0;A), if(fTestVal = 0.0);if(fTestVa

54、l != 0.0);B), if(fTestVal = -EPSINON) & (fTestVal = EPSINON); /EPSINON 為定義好的精度。哪一組或是那些組正確呢?我們來分析分析:float 和 double 類型的數(shù)據(jù)都是有精度限制的,這樣直接拿來與 0.0 比,能正確嗎?明顯不能,看例子: 的值四舍五入精確到小數(shù)點后 10 位為:3.1415926536,你拿它減去0.00000000001 然后再四舍五入得到的結(jié)果是多少?你能說前后兩個值一樣嗎?EPSINON 為定義好的精度,如果一個數(shù)落在0.0-EPSINON,0.0+EPSINON 這個閉區(qū)間內(nèi),我們認(rèn)為在某個精度

55、內(nèi)它的值與零值相等;否則不相等。擴(kuò)展一下,把 0.0 替換為你想比較的任何一個浮點數(shù),那我們就可以比較任意兩個浮點數(shù)的大小了,當(dāng)然是在某個精度內(nèi)。同樣的也不要在很大的浮點數(shù)和很小的浮點數(shù)之間進(jìn)行運(yùn)算,比如:10000000000.00 + 0.00000000001這樣計算后的結(jié)果可能會讓你大吃一驚。1.6.3,指針變量與“零值”進(jìn)行比較指針變量與“零值”進(jìn)行比較的 if 語句怎么寫?第22頁,共131頁。int * p = NULL;/定義指針一定要同時初始化,指針與數(shù)組那章會詳細(xì)講解。A), if(p = 0);B), if(p);if(p != 0);if(!p);C) , if(NUL

56、L = p); if(NULL != p);哪一組或是那些組正確呢?我們來分析分析:A)寫法:p 是整型變量?容易引起誤會,不好。盡管 NULL 的值和 0 一樣,但意義不同。B)寫法:p 是 bool 型變量?容易引起誤會,不好。C)寫法:這個寫法才是正確的,但樣子比較古怪。為什么要這么寫呢?是怕漏寫一個“=”號:if(p = NULL),這個表達(dá)式編譯器當(dāng)然會認(rèn)為是正確的,但卻不是你要表達(dá)的意思。所以,非常推薦這種寫法。1.6.4,else 到底與哪個 if 配對呢?else 常常與 if 語句配對,但要注意書寫規(guī)范,看下面例子:if(0 = x)if(0 = y) error();els

57、e/program code這個 else 到底與誰匹配呢?讓人迷糊,尤其是初學(xué)者。還好,C 語言有這樣的規(guī)定:else始終與同一括號內(nèi)最近的未匹配的 if 語句結(jié)合。雖然老手可以區(qū)分出來,但這樣的代碼誰都會頭疼的,任何時候都別偷這種懶。關(guān)于程序中的分界符和,建議如下:【建議 1-16】程序中的分界符和對齊風(fēng)格如下:注意下表中代碼的縮進(jìn)一般為 4 個字符,但不要使用 Tab 鍵,因為不同的編輯器 Tab 鍵定義的空格數(shù)量不一樣,別的編輯器打開 Tab 鍵縮進(jìn)的代碼可能會一片混亂。提倡的的風(fēng)格void Function(int x)不提倡的風(fēng)格void Function(int x)/progr

58、am code/program codeif (condition)/program codeif (condition)/program codeelse/program code第23頁,共131頁。ifelse/program codefor (initialization; condition; update)或:if (condition)/program codeelse/program code或:if (width height) dosomething();for (initialization;condition; update)/program code/program

59、codewhile (condition)while (condition)/program code/program codedo/program codedo/program codewhile (condition);while (condition);1.6.5,if 語句后面的分號關(guān)于 if-else 語句還有一個容易出錯的地方就是與空語句的連用。看下面的例子:if(NULL != p) ;fun();這里的 fun()函數(shù)并不是在 NULL != p 的時候被調(diào)用,而是任何時候都會被調(diào)用。問題就出在 if 語句后面的分號上。在 C 語言中,分號預(yù)示著一條語句的結(jié)尾,但是并不是每條

60、C 語言語句都需要分號作為結(jié)束標(biāo)志。 語句的后面并不需要分號,但如果你不小心寫了個分號,編譯器并不會提示出錯。因為編譯器會把這個分號解析成一條空語句。也就是上面的代碼實際等效于:if(NULL != p)第24頁,共131頁。;fun();這是初學(xué)者很容易犯的錯誤,往往不小心多寫了個分號,導(dǎo)致結(jié)果與預(yù)想的相差很遠(yuǎn)。所以建議在真正需要用空語句時寫成這樣:NULL;而不是單用一個分號。這就好比匯編語言里面的空指令,比如 ARM 指令中的 NOP 指令。這樣做可以明顯的區(qū)分真正必須的空語句和不小心多寫的分號。1.6.6,使用 if 語句的其他注意事項【規(guī)則 1-17】先處理正常情況,再處理異常情況。

溫馨提示

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

評論

0/150

提交評論