第3章分解Hello World——最簡單C程序組成_第1頁
第3章分解Hello World——最簡單C程序組成_第2頁
第3章分解Hello World——最簡單C程序組成_第3頁
第3章分解Hello World——最簡單C程序組成_第4頁
第3章分解Hello World——最簡單C程序組成_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第3章 分解Hello World最簡單C程序組成 在第2章讀者隨著筆者照葫蘆畫瓢,創(chuàng)建了第一個(gè)可運(yùn)行的程序。相信讀者對著源代碼一頭霧水不知所以,所以本章解釋第2章的Hello World源代碼,先回顧第2章的源代碼,如所示。3.1 C程序概貌很短,簡單幾行文字,就創(chuàng)建了一個(gè)可以運(yùn)行的程序,非常神奇。代碼雖小,但五臟俱全,綜觀整個(gè)代碼,可以總結(jié)如下特點(diǎn):(1)由單詞,符號(hào),空白組成。單詞以英語單詞為主,有的單詞就是純正的英語單詞,如main、void、include;有的不是,如getchar、pringf。單詞一般都小寫。代碼中的標(biāo)點(diǎn)符號(hào)并不是隨意輸入的。每個(gè)符號(hào)在C中都有自己的含義。中出現(xiàn)

2、的符號(hào),有“#”、“”、“()”、“”、“/*”、“*/”、“”、“;”、“”。單詞與單詞之間用空白分隔,空白可以是空格,也可以是Tab制表符。空白的個(gè)數(shù)沒有限制。(2)如同閱讀小說一樣,C源代碼也是從上往下閱讀。也就是C源代碼的先后順序是有講究的。行與行之間也可以有空白行??瞻仔袛?shù)也是沒有限制的。有的行頂格書寫,有的行卻又后退了幾個(gè)空格,這種后退,稱為“縮進(jìn)”。如何縮進(jìn),這些也都是有講究的。(3)并沒有專門的標(biāo)志表示文件從哪里起始,也沒有標(biāo)志表示文件到哪里結(jié)束。從第一個(gè)字符開始,文件就開始了,到最后一個(gè)字符結(jié)束,文件就結(jié)束了。3.2 為何有必要在代碼里留下程序員的解釋注釋 出現(xiàn)最多的是“/*

3、”和“*/”包裹起來的中文語句,這些是注釋。注釋是幫助程序員閱讀源代碼和理解源代碼的。編譯器在編譯源代碼的時(shí)候,在目標(biāo)代碼生成以前,會(huì)把注釋剔除掉然后再進(jìn)行編譯,當(dāng)然編譯器是不會(huì)修改源文件的,這一切是在內(nèi)存中完成。由于對于注釋部分忽略不處理,就如同沒有這些字符一樣,所以注釋不會(huì)增加編譯后的程序的可執(zhí)行代碼長度,對程序運(yùn)行不起任何作用。3.3 從哪里開始,到哪里結(jié)束main函數(shù) 先看下面的代碼段,這段代碼是從中截取過來的,為了學(xué)習(xí)方便,去掉了注釋部分: void main(void) printf(nHello World!); getchar(); void main(void) 這一段是在定

4、義C程序的主函數(shù)。函數(shù)是可以完成一定功能的子程序。Main函數(shù)是C語言程序的起始執(zhí)行點(diǎn)。每一個(gè)C程序必須有且僅有一個(gè)main函數(shù),它是由程序員提供的。3.4 如何在屏幕上顯示文字函數(shù)調(diào)用 Main函數(shù)體中: printf(nHello World!); 這行是調(diào)用了C語言提供的打印數(shù)輸出函數(shù),該函數(shù)的名字是“printf”,小括號(hào)內(nèi)雙引號(hào)括起來的文字是printf函數(shù)的參數(shù)。該函數(shù)的功能是把小括號(hào)里的文字原樣打印在屏幕上。也就是說雙引號(hào)里的內(nèi)容變化,則打印在屏幕上的文字也會(huì)變化。請讀者自己試驗(yàn)修改雙引號(hào)里的文字。 說明:“n”在這里有特殊的含義,讀者可以發(fā)現(xiàn)“n”并沒有在屏幕中打印出來?!皀”

5、中的“”是轉(zhuǎn)義字符,表示其后面緊跟的字符有專門的意思。“n”表示將光標(biāo)移到第二行第一格。也就是回車換行的意思。3.5 編譯器如何認(rèn)識(shí)printf函數(shù)#include預(yù)處理器指示符 源代碼最終是需要被編譯器處理的。編譯器編譯的過程比較復(fù)雜,但一般需要經(jīng)歷好幾步。第一步是預(yù)處理。所謂預(yù)處理,就是編譯前,先進(jìn)行些預(yù)先處理,如代替源代碼中需要代替的部分。#include就是這么一個(gè)預(yù)處理指示指令。 為了弄清楚#include的作用,現(xiàn)在請讀者思考一個(gè)問題:編譯器如何知道有printf這個(gè)函數(shù)?3.5.1 函數(shù)聲明及其作用上 節(jié) 中 留 給 讀 者 的 試 驗(yàn) , 修 改 p r i n t f 為 其

6、 他 單 詞 , 如print_format,則在編譯的時(shí)候,編譯器會(huì)返回錯(cuò)誤:Warning h cbook src22 2-helloworl.c:5 missing prototype for print_formatError :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_forma

7、t的函數(shù)原型。僅僅是一個(gè)警告?!癊rror :cbook src22.2helloworldc 5 undefined reference to _print_format”這句話表明,出現(xiàn)一個(gè)錯(cuò)誤,調(diào)用了一個(gè)沒有定義的函數(shù) print_format。3.5.2 試驗(yàn)尋找#include的作用中,函數(shù)printf的聲明在哪里呢?請讀者再做一個(gè)試驗(yàn):將中的第一行代碼刪除掉。就是去掉了“#include ”,再編譯看出現(xiàn)什么現(xiàn)象。整個(gè)文件代碼如下:void main(void)/*主函數(shù),入口點(diǎn)*/*函數(shù)開始*/printf(nHello World!);/*打印字符串*/getchar();/*

8、等待用戶敲入回車*/是不是編譯器又提示缺少函數(shù)原型:Warning h:cbooksrc22.2-helloworld.c: 3 missing prototype for printfWarning h:cbooksrc22.2-helloworld.c: 4 missing prototype for getchar編譯和連接 耗時(shí):0.3秒 返回代碼:03.5.3 #include的作用現(xiàn)在讓筆者來解釋#include這行代碼的作用。#include是C語言預(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文件中,所以簡單的用#include把stdio.h文件包含進(jìn)來,自然就把getchar和printf兩個(gè)函數(shù)的聲明包含進(jìn)來了。說明:函數(shù)聲明只是向編譯器登記有這么一個(gè)函數(shù),聲明了函數(shù)不調(diào)用這個(gè)函數(shù),是被容許的。這就是為什么包含了整個(gè)stdio.h文件,里面聲明了很多其他函數(shù),但實(shí)際沒有使用這些函數(shù)而編譯器又不提示的原因。3.

10、6 計(jì)算有些小作為的程序打印Hello World的程序非常簡單,則實(shí)現(xiàn)了小功能,計(jì)算1+1的值:代碼 計(jì)算1+1并打印結(jié)果Calc#include void main(void) int a,b;/*聲明a,b為整型變量*/ i n t y ;/*聲明y 為整型變量 */ a=1;/*給變量a賦值為1,此時(shí)a的值為1*/ b=1;/*給變量b賦值為1,此時(shí)b的值為1*/ y=a+b;/*將a、b的值分別取出來,計(jì)算結(jié)果后,賦值給變量y*/ printf(na+b=%d,y);/*把y的值打印出來*/ getchar();編譯后運(yùn)行,程序結(jié)果如下:a+b=23.7 數(shù)據(jù)從哪里來,又到哪里去變量

11、 在計(jì)算機(jī)程序設(shè)計(jì)中,經(jīng)常要用到變量。比如在屏幕中移動(dòng)光標(biāo),需要存儲(chǔ)光標(biāo)的x,y坐標(biāo),每次移動(dòng)光標(biāo),就需要對坐標(biāo)修改,也就是x,y的值要改變;為了得到當(dāng)前光標(biāo)的坐標(biāo),就需要從x,y中得到當(dāng)前的值,這些,在程序設(shè)計(jì)中,就是通過變量來完成。3.7.1 變量在內(nèi)存中的表現(xiàn)形式變量是指其值可以變化的量。計(jì)算機(jī)中,指令代碼、數(shù)據(jù)都存儲(chǔ)于內(nèi)存中。變量也需要存儲(chǔ)在內(nèi)存中。類比人類的思維過程,也很容易明白為什么需要內(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作為計(jì)算的數(shù)得到“3+4+5

12、=12”。這是一個(gè)很簡單的過程,思考過程幾乎不花費(fèi)時(shí)間。如果計(jì)算的變量超過100個(gè),估計(jì)大部分讀者都記不住這么多數(shù)據(jù)的值,需要把這些數(shù)據(jù)及其對應(yīng)的數(shù)值記錄在紙上或其地方,當(dāng)需要用到某個(gè)數(shù)據(jù)的時(shí)候,再去查看其對應(yīng)的值。計(jì)算機(jī)中的變量類似。在計(jì)算機(jī)中,每個(gè)變量都被分配了一塊內(nèi)存空間,在這些空間里存儲(chǔ)的就是變量的值。變量之所以可以變化,就是這個(gè)存儲(chǔ)空間可以存儲(chǔ)不同的數(shù)值。存儲(chǔ)空間里的值變化,則變量對應(yīng)的值也變化。同一個(gè)時(shí)間,內(nèi)存空間里只能保存一份值,新值沖掉了原來的舊值。每個(gè)內(nèi)存單元都有編號(hào),這些是內(nèi)存的地址。如所示3.7.2 編譯器使用變量符號(hào)表 在源代碼中,為了程序員閱讀,每個(gè)變量都有變量名。實(shí)

13、際上編譯后的目標(biāo)代碼里,并沒有變量名字,而是記錄著變量在內(nèi)存空間中的地址。變量的名字只是方便程序員閱讀才設(shè)置的。在C語言中,為了方便,通過變量名就可以訪問到變量的值,對變量名的訪問,就是對變量的值的訪問。 在編譯的過程中,編譯器會(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語言還提供其他類型的變量,詳細(xì)課程參見后續(xù)章節(jié)的論述。通過上述簡單敘

14、述,讀者可以對變量有了一個(gè)大概的感性認(rèn)識(shí)了。再回過頭來看看源代碼中每行的意思。(1)int a,b;這是向編譯器聲明,以下程序?qū)?huì)用到兩個(gè)整型變量,其名字為a和b。此時(shí)并不會(huì)進(jìn)行真正的內(nèi)存分配動(dòng)作,也就是此時(shí)并沒有內(nèi)存地址與變量名關(guān)聯(lián)。(2)int y;同樣是向編譯器聲明,一下程序會(huì)用到整型變量y。變量可以一行聲明多個(gè),也可以一行聲明一個(gè),多個(gè)變量分多次聲明,意義都一樣。(3)a=1;這是給a賦值。請讀者注意等號(hào)“=”,“=”是C語言提供的運(yùn)算符。在C語言里的“=”不同于數(shù)學(xué)里的等號(hào)“=”。數(shù)學(xué)中的等號(hào)是說“=”兩邊相等,左右等價(jià),可以交換。計(jì)算機(jī)中的“=”是賦值符號(hào),有一個(gè)運(yùn)算順序,是先計(jì)算

15、“=”右邊的表達(dá)式的值,然后把數(shù)值賦給左邊。左右不能交換。所謂賦值,就是把運(yùn)算所得的數(shù)值存儲(chǔ)在內(nèi)存中。(4)b=1;同樣的編譯分配內(nèi)存空間給變量b,地址為2004,然后將數(shù)值1存儲(chǔ)在2004對應(yīng)的內(nèi)存空間里。(5)y=a+b;這里的“+”,也是C語言提供的運(yùn)算符。同數(shù)學(xué)里的四則運(yùn)算中的“+”一樣,進(jìn)行加法運(yùn)算。(6)printf(na+b=%d,y);把y的值打印出來。這里同樣要訪問變量y去獲取其值。過程同上。3.8 自己設(shè)計(jì)C函數(shù) 用C語言庫函數(shù)和第三方提供的函數(shù)組裝程序是程序設(shè)計(jì)的一條捷徑和重要方法。但是,一個(gè)C程序不可能只由一個(gè)main函數(shù)組成,在main函數(shù)中實(shí)現(xiàn)所有的功能。編寫程序,

16、更多的時(shí)候需要程序員自己動(dòng)手創(chuàng)建新的函數(shù)。3.8.1 在main函數(shù)中計(jì)算3個(gè)整數(shù)的平均數(shù)先請看:代碼 在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 23.8.2 在main函數(shù)中分3次計(jì)算3個(gè)整數(shù)的平均數(shù)如果需求變化為先計(jì)算1,2,3這三個(gè)整數(shù)的平均值后,再計(jì)算1234,2345,3456這三個(gè)整數(shù)的平均值,最后計(jì)算9876,2345,1這三個(gè)整數(shù)的平均值呢?

17、方法一如所示。代碼 分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); printf(n the average is %d,y3);3.8.3 自編函數(shù)實(shí)

18、現(xiàn)計(jì)算3個(gè)整數(shù)的平均數(shù)請讀者將目光關(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行代碼功能相同,雖然很簡單,但是可以將其抽取出來,形成一個(gè)函數(shù)。具體代碼如所示。3.8.4 如何自編寫函數(shù)對有以下說明:(1)int average(int a,int b,int c);函數(shù)聲明。聲明是向編譯器登記有這么一個(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語言提供的關(guān)鍵字。從函數(shù)調(diào)用中返回。并向調(diào)用者返回其后帶動(dòng)表達(dá)式的值。3.8.5 試驗(yàn)觀察總結(jié)函數(shù)聲明和函數(shù)定義的意義 請讀者做試驗(yàn),查看的編譯鏈接結(jié)果:3.9 語句構(gòu)成程序C語言有5種類型的語句,如下:(1)表達(dá)式語句。C語言中,操作或者動(dòng)作被稱為表達(dá)式。以分號(hào)結(jié)尾的表達(dá)式稱為

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論