




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第3章 分解Hello World最簡(jiǎn)單C程序組成,在第2章讀者隨著筆者照葫蘆畫瓢,創(chuàng)建了第一個(gè)可運(yùn)行的程序。相信讀者對(duì)著源代碼一頭霧水不知所以,所以本章解釋第2章的Hello World源代碼,先回顧第2章的源代碼,如所示。,3.1 C程序概貌,很短,簡(jiǎn)單幾行文字,就創(chuàng)建了一個(gè)可以運(yùn)行的程序,非常神奇。代碼雖小,但五臟俱全,綜觀整個(gè)代碼,可以總結(jié)如下特點(diǎn): (1)由單詞,符號(hào),空白組成。單詞以英語(yǔ)單詞為主,有的單詞就是純正的英語(yǔ)單詞,如main、void、include;有的不是,如getchar、pringf。單詞一般都小寫。代碼中的標(biāo)點(diǎn)符號(hào)并不是隨意輸入的。每個(gè)符號(hào)在C中都有自己的含義。
2、中出現(xiàn)的符號(hào),有“#”、“”、“()”、“”、“/*”、“*/”、“”、“;”、“”。單詞與單詞之間用空白分隔,空白可以是空格,也可以是Tab制表符。空白的個(gè)數(shù)沒(méi)有限制。 (2)如同閱讀小說(shuō)一樣,C源代碼也是從上往下閱讀。也就是C源代碼的先后順序是有講究的。行與行之間也可以有空白行。空白行數(shù)也是沒(méi)有限制的。有的行頂格書寫,有的行卻又后退了幾個(gè)空格,這種后退,稱為“縮進(jìn)”。如何縮進(jìn),這些也都是有講究的。 (3)并沒(méi)有專門的標(biāo)志表示文件從哪里起始,也沒(méi)有標(biāo)志表示文件到哪里結(jié)束。從第一個(gè)字符開(kāi)始,文件就開(kāi)始了,到最后一個(gè)字符結(jié)束,文件就結(jié)束了。,3.2 為何有必要在代碼里留下程序員的解釋注釋,出現(xiàn)最
3、多的是“/*”和“*/”包裹起來(lái)的中文語(yǔ)句,這些是注釋。注釋是幫助程序員閱讀源代碼和理解源代碼的。編譯器在編譯源代碼的時(shí)候,在目標(biāo)代碼生成以前,會(huì)把注釋剔除掉然后再進(jìn)行編譯,當(dāng)然編譯器是不會(huì)修改源文件的,這一切是在內(nèi)存中完成。由于對(duì)于注釋部分忽略不處理,就如同沒(méi)有這些字符一樣,所以注釋不會(huì)增加編譯后的程序的可執(zhí)行代碼長(zhǎng)度,對(duì)程序運(yùn)行不起任何作用。,3.3 從哪里開(kāi)始,到哪里結(jié)束main函數(shù),先看下面的代碼段,這段代碼是從中截取過(guò)來(lái)的,為了學(xué)習(xí)方便,去掉了注釋部分: void main(void) printf(nHello World!); getchar(); void main(void)
4、 這一段是在定義C程序的主函數(shù)。函數(shù)是可以完成一定功能的子程序。Main函數(shù)是C語(yǔ)言程序的起始執(zhí)行點(diǎn)。每一個(gè)C程序必須有且僅有一個(gè)main函數(shù),它是由程序員提供的。,3.4 如何在屏幕上顯示文字函數(shù)調(diào)用,Main函數(shù)體中: printf(nHello World!); 這行是調(diào)用了C語(yǔ)言提供的打印數(shù)輸出函數(shù),該函數(shù)的名字是“printf”,小括號(hào)內(nèi)雙引號(hào)括起來(lái)的文字是printf函數(shù)的參數(shù)。該函數(shù)的功能是把小括號(hào)里的文字原樣打印在屏幕上。也就是說(shuō)雙引號(hào)里的內(nèi)容變化,則打印在屏幕上的文字也會(huì)變化。請(qǐng)讀者自己試驗(yàn)修改雙引號(hào)里的文字。 說(shuō)明:“n”在這里有特殊的含義,讀者可以發(fā)現(xiàn)“n”并沒(méi)有在屏幕中
5、打印出來(lái)?!皀”中的“”是轉(zhuǎn)義字符,表示其后面緊跟的字符有專門的意思?!皀”表示將光標(biāo)移到第二行第一格。也就是回車換行的意思。,3.5 編譯器如何認(rèn)識(shí)printf函數(shù)#include預(yù)處理器指示符,源代碼最終是需要被編譯器處理的。編譯器編譯的過(guò)程比較復(fù)雜,但一般需要經(jīng)歷好幾步。第一步是預(yù)處理。所謂預(yù)處理,就是編譯前,先進(jìn)行些預(yù)先處理,如代替源代碼中需要代替的部分。#include就是這么一個(gè)預(yù)處理指示指令。 為了弄清楚#include的作用,現(xiàn)在請(qǐng)讀者思考一個(gè)問(wèn)題:編譯器如何知道有printf這個(gè)函數(shù)?,3.5.1 函數(shù)聲明及其作用,上節(jié)中留給讀者的試驗(yàn),修改printf為其他單詞,如prin
6、t_format,則在編譯的時(shí)候,編譯器會(huì)返回錯(cuò)誤: Warning h cbook src22 2-helloworl.c:5 missing prototype for print_format Error :cbook src22.2helloworldc 5 undefined reference to _print_format 編譯和連接 耗時(shí) : 3.3秒 返回代碼 : 1 “Warning h cbook src22 2-helloworl.c:5 missing prototype for print_format”這句話表明,丟失了print_format的函數(shù)原型。僅僅是
7、一個(gè)警告?!癊rror :cbook src22.2helloworldc 5 undefined reference to _print_format”這句話表明,出現(xiàn)一個(gè)錯(cuò)誤,調(diào)用了一個(gè)沒(méi)有定義的函數(shù) print_format。,3.5.2 試驗(yàn)尋找#include的作用,中,函數(shù)printf的聲明在哪里呢?請(qǐng)讀者再做一個(gè)試驗(yàn):將中的第一行代碼刪除掉。就是去掉了“#include ”,再編譯看出現(xiàn)什么現(xiàn)象。整個(gè)文件代碼如下: void main(void)/*主函數(shù),入口點(diǎn)*/ /*函數(shù)開(kāi)始*/ printf(nHello World!);/*打印字符串*/ getchar();/*等待用
8、戶敲入回車*/ 是不是編譯器又提示缺少函數(shù)原型: Warning h:cbooksrc22.2-helloworld.c: 3 missing prototype for printf Warning h:cbooksrc22.2-helloworld.c: 4 missing prototype for getchar 編譯和連接 耗時(shí):0.3秒 返回代碼:0 3.5.3 #include的作用 現(xiàn)在讓筆者來(lái)解釋#include這行代碼的作用。 #include是C語(yǔ)言預(yù)處理器指示符。#和include之間可以有多個(gè)空格。#也不一定要頂格,但是一定是第一個(gè)非空白字符。#include的作用,
9、是告訴編譯器在編譯前,要做些預(yù)先處理:將后面中的文件內(nèi)容包含到當(dāng)前文件內(nèi)。所謂包含,是指將中列出的文件的內(nèi)容復(fù)制到當(dāng)前文件里。 注意:#一定要是第一個(gè)非空白字符。否則編譯器會(huì)提示錯(cuò)誤,并且錯(cuò)誤信息和出錯(cuò)原因完全不匹配。 因?yàn)間etchar和printf兩個(gè)函數(shù)的聲明位于stdio.h文件中,所以簡(jiǎn)單的用#include把stdio.h文件包含進(jìn)來(lái),自然就把getchar和printf兩個(gè)函數(shù)的聲明包含進(jìn)來(lái)了。 說(shuō)明:函數(shù)聲明只是向編譯器登記有這么一個(gè)函數(shù),聲明了函數(shù)不調(diào)用這個(gè)函數(shù),是被容許的。這就是為什么包含了整個(gè)stdio.h文件,里面聲明了很多其他函數(shù),但實(shí)際沒(méi)有使用這些函數(shù)而編譯器又不提
10、示的原因。,3.6 計(jì)算有些小作為的程序,打印Hello World的程序非常簡(jiǎn)單,則實(shí)現(xiàn)了小功能,計(jì)算1+1的值: 代碼 計(jì)算1+1并打印結(jié)果Calc #include void main(void) int a,b;/*聲明a,b為整型變量*/ int y;/*聲明y 為整型變量 */ a=1;/*給變量a賦值為1,此時(shí)a的值為1*/ b=1;/*給變量b賦值為1,此時(shí)b的值為1*/ y=a+b;/*將a、b的值分別取出來(lái),計(jì)算結(jié)果后,賦值給變量y*/ printf(na+b=%d,y);/*把y的值打印出來(lái)*/ getchar(); 編譯后運(yùn)行,程序結(jié)果如下: a+b=2,3.7 數(shù)據(jù)從
11、哪里來(lái),又到哪里去變量,在計(jì)算機(jī)程序設(shè)計(jì)中,經(jīng)常要用到變量。比如在屏幕中移動(dòng)光標(biāo),需要存儲(chǔ)光標(biāo)的x,y坐標(biāo),每次移動(dòng)光標(biāo),就需要對(duì)坐標(biāo)修改,也就是x,y的值要改變;為了得到當(dāng)前光標(biāo)的坐標(biāo),就需要從x,y中得到當(dāng)前的值,這些,在程序設(shè)計(jì)中,就是通過(guò)變量來(lái)完成。,3.7.1 變量在內(nèi)存中的表現(xiàn)形式,變量是指其值可以變化的量。計(jì)算機(jī)中,指令代碼、數(shù)據(jù)都存儲(chǔ)于內(nèi)存中。變量也需要存儲(chǔ)在內(nèi)存中。 類比人類的思維過(guò)程,也很容易明白為什么需要內(nèi)存空間存儲(chǔ)變量:假設(shè)現(xiàn)在有三個(gè)數(shù)據(jù),分別是a=3,b=4,c=5,需要讀者去計(jì)算“a+b+c”的值。讀者首先回憶a的值是3,b的值是4,c的值是5,然后分別用3,4,5
12、作為計(jì)算的數(shù)得到“3+4+5=12”。這是一個(gè)很簡(jiǎn)單的過(guò)程,思考過(guò)程幾乎不花費(fèi)時(shí)間。如果計(jì)算的變量超過(guò)100個(gè),估計(jì)大部分讀者都記不住這么多數(shù)據(jù)的值,需要把這些數(shù)據(jù)及其對(duì)應(yīng)的數(shù)值記錄在紙上或其地方,當(dāng)需要用到某個(gè)數(shù)據(jù)的時(shí)候,再去查看其對(duì)應(yīng)的值。計(jì)算機(jī)中的變量類似。 在計(jì)算機(jī)中,每個(gè)變量都被分配了一塊內(nèi)存空間,在這些空間里存儲(chǔ)的就是變量的值。變量之所以可以變化,就是這個(gè)存儲(chǔ)空間可以存儲(chǔ)不同的數(shù)值。存儲(chǔ)空間里的值變化,則變量對(duì)應(yīng)的值也變化。同一個(gè)時(shí)間,內(nèi)存空間里只能保存一份值,新值沖掉了原來(lái)的舊值。每個(gè)內(nèi)存單元都有編號(hào),這些是內(nèi)存的地址。如所示,3.7.2 編譯器使用變量符號(hào)表,在源代碼中,為了程
13、序員閱讀,每個(gè)變量都有變量名。實(shí)際上編譯后的目標(biāo)代碼里,并沒(méi)有變量名字,而是記錄著變量在內(nèi)存空間中的地址。變量的名字只是方便程序員閱讀才設(shè)置的。在C語(yǔ)言中,為了方便,通過(guò)變量名就可以訪問(wèn)到變量的值,對(duì)變量名的訪問(wèn),就是對(duì)變量的值的訪問(wèn)。 在編譯的過(guò)程中,編譯器會(huì)建立一張變量符號(hào)表,該表記錄的數(shù)據(jù)是:變量類型、變量名、變量地址等信息。 如上中,編譯器會(huì)建立變量符號(hào)表如所示。,3.7.3 變量及使用,變量有不同的類型,如記錄英文字母及標(biāo)點(diǎn)符號(hào),就需要字符類型(char)的變量;記錄整數(shù)需要整數(shù)類型int的變量;記錄實(shí)數(shù)有float類型的變量。這些變量都是數(shù)值類型,C語(yǔ)言還提供其他類型的變量,詳細(xì)課
14、程參見(jiàn)后續(xù)章節(jié)的論述。 通過(guò)上述簡(jiǎn)單敘述,讀者可以對(duì)變量有了一個(gè)大概的感性認(rèn)識(shí)了。再回過(guò)頭來(lái)看看源代碼中每行的意思。 (1)int a,b;這是向編譯器聲明,以下程序?qū)?huì)用到兩個(gè)整型變量,其名字為a和b。此時(shí)并不會(huì)進(jìn)行真正的內(nèi)存分配動(dòng)作,也就是此時(shí)并沒(méi)有內(nèi)存地址與變量名關(guān)聯(lián)。 (2)int y;同樣是向編譯器聲明,一下程序會(huì)用到整型變量y。變量可以一行聲明多個(gè),也可以一行聲明一個(gè),多個(gè)變量分多次聲明,意義都一樣。 (3)a=1;這是給a賦值。請(qǐng)讀者注意等號(hào)“=”,“=”是C語(yǔ)言提供的運(yùn)算符。在C語(yǔ)言里的“=”不同于數(shù)學(xué)里的等號(hào)“=”。數(shù)學(xué)中的等號(hào)是說(shuō)“=”兩邊相等,左右等價(jià),可以交換。計(jì)算機(jī)中
15、的“=”是賦值符號(hào),有一個(gè)運(yùn)算順序,是先計(jì)算“=”右邊的表達(dá)式的值,然后把數(shù)值賦給左邊。左右不能交換。所謂賦值,就是把運(yùn)算所得的數(shù)值存儲(chǔ)在內(nèi)存中。 (4)b=1;同樣的編譯分配內(nèi)存空間給變量b,地址為2004,然后將數(shù)值1存儲(chǔ)在2004對(duì)應(yīng)的內(nèi)存空間里。 (5)y=a+b;這里的“+”,也是C語(yǔ)言提供的運(yùn)算符。同數(shù)學(xué)里的四則運(yùn)算中的“+”一樣,進(jìn)行加法運(yùn)算。 (6)printf(na+b=%d,y);把y的值打印出來(lái)。這里同樣要訪問(wèn)變量y去獲取其值。過(guò)程同上。,3.8 自己設(shè)計(jì)C函數(shù),用C語(yǔ)言庫(kù)函數(shù)和第三方提供的函數(shù)組裝程序是程序設(shè)計(jì)的一條捷徑和重要方法。但是,一個(gè)C程序不可能只由一個(gè)main
16、函數(shù)組成,在main函數(shù)中實(shí)現(xiàn)所有的功能。編寫程序,更多的時(shí)候需要程序員自己動(dòng)手創(chuàng)建新的函數(shù)。,3.8.1 在main函數(shù)中計(jì)算3個(gè)整數(shù)的平均數(shù),先請(qǐng)看: 代碼 在main中計(jì)算3個(gè)整數(shù)的平均數(shù)Average #include void main(void) int a=1,b=2,c=3; int y = (a+b+c) / 3; printf(n the average is %d,y); 編譯運(yùn)行,程序輸出為: the average is 2,3.8.2 在main函數(shù)中分3次計(jì)算3個(gè)整數(shù)的平均數(shù),如果需求變化為先計(jì)算1,2,3這三個(gè)整數(shù)的平均值后,再計(jì)算1234,2345,3456這
17、三個(gè)整數(shù)的平均值,最后計(jì)算9876,2345,1這三個(gè)整數(shù)的平均值呢?方法一如所示。 代碼 分3次計(jì)算3個(gè)整數(shù)的平均值A(chǔ)verage2 #include void main(void) int a=1,b=2,c=3; int a2=1234,b2=2345,c2=3456; int a3=9876,b3=2345,c3=1; int y = (a+b+c) / 3; int y2= (a2+b2+c2) /3; int y3= (a3+b3+c3) /3; printf(n the average is %d,y); printf(n the average is %d,y2); print
18、f(n the average is %d,y3); ,3.8.3 自編函數(shù)實(shí)現(xiàn)計(jì)算3個(gè)整數(shù)的平均數(shù),請(qǐng)讀者將目光關(guān)注以下3行代碼上: int y = (a+b+c) / 3; int y2= (a2+b2+c2) /3; int y3= (a3+b3+c3) /3; 這3行代碼將求平均值的公式使用了3次。重復(fù)的代碼將使得以后的代碼維護(hù)困難,因?yàn)橐粋€(gè)地方修改,其他重復(fù)的地方也要修改。這3行代碼功能相同,雖然很簡(jiǎn)單,但是可以將其抽取出來(lái),形成一個(gè)函數(shù)。具體代碼如所示。,3.8.4 如何自編寫函數(shù),對(duì)有以下說(shuō)明: (1)int average(int a,int b,int c);函數(shù)聲明。聲明是
19、向編譯器登記有這么一個(gè)函數(shù),其函數(shù)原型如聲明中所示。average函數(shù)的原型告訴編譯器: (2)函數(shù)聲明后,就可以調(diào)用該函數(shù)了。如同上文所述,編譯器知道有某個(gè)函數(shù)的原型后,即認(rèn)為該函數(shù)可以調(diào)用。 (3)函數(shù)定義部分。以下部分就是函數(shù)定義。 int average(int a,int b,int c) return (a+b+c)/3; (4)return是C語(yǔ)言提供的關(guān)鍵字。從函數(shù)調(diào)用中返回。并向調(diào)用者返回其后帶動(dòng)表達(dá)式的值。,3.8.5 試驗(yàn)觀察總結(jié)函數(shù)聲明和函數(shù)定義的意義,請(qǐng)讀者做試驗(yàn),查看的編譯鏈接結(jié)果:,3.9 語(yǔ)句構(gòu)成程序,C語(yǔ)言有5種類型的語(yǔ)句,如下: (1)表達(dá)式語(yǔ)句。C語(yǔ)言中,操作或者動(dòng)作被稱為表達(dá)式。以分號(hào)結(jié)尾的表達(dá)式稱為表達(dá)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 直播運(yùn)營(yíng)考核合同范本
- 買賣小車指標(biāo)合同范本
- 擋墻項(xiàng)目正規(guī)合同范本
- 單位安裝電子門合同范本
- ktv出兌合同范本
- 保安安潔服務(wù)合同范本
- 農(nóng)村自建房合同范本
- 個(gè)人汽車轉(zhuǎn)讓合同范本
- 勞務(wù)派遣未簽合同范本
- 產(chǎn)品宣傳授權(quán)合同范本
- GB/T 13277.4-2015壓縮空氣第4部分:固體顆粒測(cè)量方法
- 人教版八年級(jí)下冊(cè)歷史全冊(cè)教案完整版教學(xué)設(shè)計(jì)含教學(xué)反思
- 提高白云石配比對(duì)燒結(jié)生產(chǎn)的影響
- 《城市軌道交通應(yīng)急處理》課件-《城市軌道交通應(yīng)急處理》項(xiàng)目一
- 公安基礎(chǔ)知識(shí)考試題庫(kù)(含各題型)
- 2023年云上貴州大數(shù)據(jù)(集團(tuán))有限公司招聘筆試題庫(kù)及答案解析
- 選礦試車方案
- 自來(lái)水用水證明
- 小課題專題研究參考題目
- 《最好的未來(lái)》合唱曲譜
- 車輛租賃服務(wù)內(nèi)容及保障措施方案
評(píng)論
0/150
提交評(píng)論