版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第3章 分解Hello World最簡單C程序組成 在第2章讀者隨著筆者照葫蘆畫瓢,創(chuàng)建了第一個可運行的程序。相信讀者對著源代碼一頭霧水不知所以,所以本章解釋第2章的Hello World源代碼,先回顧第2章的源代碼,如所示。3.1 C程序概貌很短,簡單幾行文字,就創(chuàng)建了一個可以運行的程序,非常神奇。代碼雖小,但五臟俱全,綜觀整個代碼,可以總結(jié)如下特點:(1)由單詞,符號,空白組成。單詞以英語單詞為主,有的單詞就是純正的英語單詞,如main、void、include;有的不是,如getchar、pringf。單詞一般都小寫。代碼中的標點符號并不是隨意輸入的。每個符號在C中都有自己的含義。中出現(xiàn)
2、的符號,有“#”、“”、“()”、“”、“/*”、“*/”、“”、“;”、“”。單詞與單詞之間用空白分隔,空白可以是空格,也可以是Tab制表符??瞻椎膫€數(shù)沒有限制。(2)如同閱讀小說一樣,C源代碼也是從上往下閱讀。也就是C源代碼的先后順序是有講究的。行與行之間也可以有空白行。空白行數(shù)也是沒有限制的。有的行頂格書寫,有的行卻又后退了幾個空格,這種后退,稱為“縮進”。如何縮進,這些也都是有講究的。(3)并沒有專門的標志表示文件從哪里起始,也沒有標志表示文件到哪里結(jié)束。從第一個字符開始,文件就開始了,到最后一個字符結(jié)束,文件就結(jié)束了。3.2 為何有必要在代碼里留下程序員的解釋注釋 出現(xiàn)最多的是“/*
3、”和“*/”包裹起來的中文語句,這些是注釋。注釋是幫助程序員閱讀源代碼和理解源代碼的。編譯器在編譯源代碼的時候,在目標代碼生成以前,會把注釋剔除掉然后再進行編譯,當然編譯器是不會修改源文件的,這一切是在內(nèi)存中完成。由于對于注釋部分忽略不處理,就如同沒有這些字符一樣,所以注釋不會增加編譯后的程序的可執(zhí)行代碼長度,對程序運行不起任何作用。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í)行點。每一個C程序必須有且僅有一個main函數(shù),它是由程序員提供的。3.4 如何在屏幕上顯示文字函數(shù)調(diào)用 Main函數(shù)體中: printf(nHello World!); 這行是調(diào)用了C語言提供的打印數(shù)輸出函數(shù),該函數(shù)的名字是“printf”,小括號內(nèi)雙引號括起來的文字是printf函數(shù)的參數(shù)。該函數(shù)的功能是把小括號里的文字原樣打印在屏幕上。也就是說雙引號里的內(nèi)容變化,則打印在屏幕上的文字也會變化。請讀者自己試驗修改雙引號里的文字。 說明:“n”在這里有特殊的含義,讀者可以發(fā)現(xiàn)“n”并沒有在屏幕中打印出來?!皀”
5、中的“”是轉(zhuǎn)義字符,表示其后面緊跟的字符有專門的意思?!皀”表示將光標移到第二行第一格。也就是回車換行的意思。3.5 編譯器如何認識printf函數(shù)#include預(yù)處理器指示符 源代碼最終是需要被編譯器處理的。編譯器編譯的過程比較復(fù)雜,但一般需要經(jīng)歷好幾步。第一步是預(yù)處理。所謂預(yù)處理,就是編譯前,先進行些預(yù)先處理,如代替源代碼中需要代替的部分。#include就是這么一個預(yù)處理指示指令。 為了弄清楚#include的作用,現(xiàn)在請讀者思考一個問題:編譯器如何知道有printf這個函數(shù)?3.5.1 函數(shù)聲明及其作用上 節(jié) 中 留 給 讀 者 的 試 驗 , 修 改 p r i n t f 為 其
6、 他 單 詞 , 如print_format,則在編譯的時候,編譯器會返回錯誤:Warning h cbook src22 2-helloworl.c:5 missing prototype for print_formatError :cbook src22.2helloworldc 5 undefined reference to _print_format編譯和連接 耗時 : 3.3秒 返回代碼 : 1“Warning h cbook src22 2-helloworl.c:5 missing prototype for print_format”這句話表明,丟失了print_forma
7、t的函數(shù)原型。僅僅是一個警告?!癊rror :cbook src22.2helloworldc 5 undefined reference to _print_format”這句話表明,出現(xiàn)一個錯誤,調(diào)用了一個沒有定義的函數(shù) print_format。3.5.2 試驗尋找#include的作用中,函數(shù)printf的聲明在哪里呢?請讀者再做一個試驗:將中的第一行代碼刪除掉。就是去掉了“#include ”,再編譯看出現(xiàn)什么現(xiàn)象。整個文件代碼如下:void main(void)/*主函數(shù),入口點*/*函數(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編譯和連接 耗時:0.3秒 返回代碼:03.5.3 #include的作用現(xiàn)在讓筆者來解釋#include這行代碼的作用。#include是C語言預(yù)處理器指示符。#和include之間可以有多個空格。#也不一定要頂格,但是一定是第一個非空白字符。#include的作用,是告訴編
9、譯器在編譯前,要做些預(yù)先處理:將后面中的文件內(nèi)容包含到當前文件內(nèi)。所謂包含,是指將中列出的文件的內(nèi)容復(fù)制到當前文件里。注意:#一定要是第一個非空白字符。否則編譯器會提示錯誤,并且錯誤信息和出錯原因完全不匹配。因為getchar和printf兩個函數(shù)的聲明位于stdio.h文件中,所以簡單的用#include把stdio.h文件包含進來,自然就把getchar和printf兩個函數(shù)的聲明包含進來了。說明:函數(shù)聲明只是向編譯器登記有這么一個函數(shù),聲明了函數(shù)不調(diào)用這個函數(shù),是被容許的。這就是為什么包含了整個stdio.h文件,里面聲明了很多其他函數(shù),但實際沒有使用這些函數(shù)而編譯器又不提示的原因。3.
10、6 計算有些小作為的程序打印Hello World的程序非常簡單,則實現(xiàn)了小功能,計算1+1的值:代碼 計算1+1并打印結(jié)果Calc#include void main(void) int a,b;/*聲明a,b為整型變量*/ i n t y ;/*聲明y 為整型變量 */ a=1;/*給變量a賦值為1,此時a的值為1*/ b=1;/*給變量b賦值為1,此時b的值為1*/ y=a+b;/*將a、b的值分別取出來,計算結(jié)果后,賦值給變量y*/ printf(na+b=%d,y);/*把y的值打印出來*/ getchar();編譯后運行,程序結(jié)果如下:a+b=23.7 數(shù)據(jù)從哪里來,又到哪里去變量
11、 在計算機程序設(shè)計中,經(jīng)常要用到變量。比如在屏幕中移動光標,需要存儲光標的x,y坐標,每次移動光標,就需要對坐標修改,也就是x,y的值要改變;為了得到當前光標的坐標,就需要從x,y中得到當前的值,這些,在程序設(shè)計中,就是通過變量來完成。3.7.1 變量在內(nèi)存中的表現(xiàn)形式變量是指其值可以變化的量。計算機中,指令代碼、數(shù)據(jù)都存儲于內(nèi)存中。變量也需要存儲在內(nèi)存中。類比人類的思維過程,也很容易明白為什么需要內(nèi)存空間存儲變量:假設(shè)現(xiàn)在有三個數(shù)據(jù),分別是a=3,b=4,c=5,需要讀者去計算“a+b+c”的值。讀者首先回憶a的值是3,b的值是4,c的值是5,然后分別用3,4,5作為計算的數(shù)得到“3+4+5
12、=12”。這是一個很簡單的過程,思考過程幾乎不花費時間。如果計算的變量超過100個,估計大部分讀者都記不住這么多數(shù)據(jù)的值,需要把這些數(shù)據(jù)及其對應(yīng)的數(shù)值記錄在紙上或其地方,當需要用到某個數(shù)據(jù)的時候,再去查看其對應(yīng)的值。計算機中的變量類似。在計算機中,每個變量都被分配了一塊內(nèi)存空間,在這些空間里存儲的就是變量的值。變量之所以可以變化,就是這個存儲空間可以存儲不同的數(shù)值。存儲空間里的值變化,則變量對應(yīng)的值也變化。同一個時間,內(nèi)存空間里只能保存一份值,新值沖掉了原來的舊值。每個內(nèi)存單元都有編號,這些是內(nèi)存的地址。如所示3.7.2 編譯器使用變量符號表 在源代碼中,為了程序員閱讀,每個變量都有變量名。實
13、際上編譯后的目標代碼里,并沒有變量名字,而是記錄著變量在內(nèi)存空間中的地址。變量的名字只是方便程序員閱讀才設(shè)置的。在C語言中,為了方便,通過變量名就可以訪問到變量的值,對變量名的訪問,就是對變量的值的訪問。 在編譯的過程中,編譯器會建立一張變量符號表,該表記錄的數(shù)據(jù)是:變量類型、變量名、變量地址等信息。 如上中,編譯器會建立變量符號表如所示。3.7.3 變量及使用變量有不同的類型,如記錄英文字母及標點符號,就需要字符類型(char)的變量;記錄整數(shù)需要整數(shù)類型int的變量;記錄實數(shù)有float類型的變量。這些變量都是數(shù)值類型,C語言還提供其他類型的變量,詳細課程參見后續(xù)章節(jié)的論述。通過上述簡單敘
14、述,讀者可以對變量有了一個大概的感性認識了。再回過頭來看看源代碼中每行的意思。(1)int a,b;這是向編譯器聲明,以下程序?qū)玫絻蓚€整型變量,其名字為a和b。此時并不會進行真正的內(nèi)存分配動作,也就是此時并沒有內(nèi)存地址與變量名關(guān)聯(lián)。(2)int y;同樣是向編譯器聲明,一下程序會用到整型變量y。變量可以一行聲明多個,也可以一行聲明一個,多個變量分多次聲明,意義都一樣。(3)a=1;這是給a賦值。請讀者注意等號“=”,“=”是C語言提供的運算符。在C語言里的“=”不同于數(shù)學(xué)里的等號“=”。數(shù)學(xué)中的等號是說“=”兩邊相等,左右等價,可以交換。計算機中的“=”是賦值符號,有一個運算順序,是先計算
15、“=”右邊的表達式的值,然后把數(shù)值賦給左邊。左右不能交換。所謂賦值,就是把運算所得的數(shù)值存儲在內(nèi)存中。(4)b=1;同樣的編譯分配內(nèi)存空間給變量b,地址為2004,然后將數(shù)值1存儲在2004對應(yīng)的內(nèi)存空間里。(5)y=a+b;這里的“+”,也是C語言提供的運算符。同數(shù)學(xué)里的四則運算中的“+”一樣,進行加法運算。(6)printf(na+b=%d,y);把y的值打印出來。這里同樣要訪問變量y去獲取其值。過程同上。3.8 自己設(shè)計C函數(shù) 用C語言庫函數(shù)和第三方提供的函數(shù)組裝程序是程序設(shè)計的一條捷徑和重要方法。但是,一個C程序不可能只由一個main函數(shù)組成,在main函數(shù)中實現(xiàn)所有的功能。編寫程序,
16、更多的時候需要程序員自己動手創(chuàng)建新的函數(shù)。3.8.1 在main函數(shù)中計算3個整數(shù)的平均數(shù)先請看:代碼 在main中計算3個整數(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);編譯運行,程序輸出為:the average is 23.8.2 在main函數(shù)中分3次計算3個整數(shù)的平均數(shù)如果需求變化為先計算1,2,3這三個整數(shù)的平均值后,再計算1234,2345,3456這三個整數(shù)的平均值,最后計算9876,2345,1這三個整數(shù)的平均值呢?
17、方法一如所示。代碼 分3次計算3個整數(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ù)實
18、現(xiàn)計算3個整數(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ù)的代碼將使得以后的代碼維護困難,因為一個地方修改,其他重復(fù)的地方也要修改。這3行代碼功能相同,雖然很簡單,但是可以將其抽取出來,形成一個函數(shù)。具體代碼如所示。3.8.4 如何自編寫函數(shù)對有以下說明:(1)int average(int a,int b,int c);函數(shù)聲明。聲明是向編譯器登記有這么一個函數(shù),其函數(shù)原型如聲明中所示。average函數(shù)的原型告訴編譯器:(2)函數(shù)聲明后,就可以調(diào)用該函數(shù)了。如同上文所述,編譯器知道有某個函數(shù)的原型后,即認為該函數(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)用者返回其后帶動表達式的值。3.8.5 試驗觀察總結(jié)函數(shù)聲明和函數(shù)定義的意義 請讀者做試驗,查看的編譯鏈接結(jié)果:3.9 語句構(gòu)成程序C語言有5種類型的語句,如下:(1)表達式語句。C語言中,操作或者動作被稱為表達式。以分號結(jié)尾的表達式稱為
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能算法與應(yīng)用案例研究
- 工業(yè)互聯(lián)網(wǎng)技術(shù)在智能制造領(lǐng)域應(yīng)用效果評估報告
- 2026年化學(xué)實驗操作試題常見化學(xué)實驗安全操作規(guī)范
- 2026年軟件測試工程師面試寶典測試用例答題技巧與評分標準
- 2026年生物科技前沿知識模擬試題
- 2026年生物技術(shù)實驗技能考核基因編輯技術(shù)實驗操作題
- 2026年P(guān)MP變更管理與執(zhí)行策略題集
- 2026年制造業(yè)崗候選人庫存管理與周轉(zhuǎn)率提升策略試題
- 2026年數(shù)據(jù)庫系統(tǒng)基礎(chǔ)概念與原理測試題
- 2026年記者心理素質(zhì)提升采訪心理障礙克服與應(yīng)對題集
- GB/T 46886-2025智能檢測裝備通用技術(shù)要求
- 護理護理科研與論文寫作
- 2025年健康體檢中心服務(wù)與質(zhì)量管理手冊
- 2025-2030中國駱駝市場前景規(guī)劃與投資運作模式分析研究報告
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫及完整答案詳解一套
- 鋼結(jié)構(gòu)玻璃雨棚安裝施工方案
- 鄂爾多斯輔警考試題型及答案
- 《中華人民共和國危險化學(xué)品安全法》全套解讀
- 房建工程電氣安裝施工方案
- 同等學(xué)力申碩公共管理真題及答案
- 2025初三英語中考英語滿分作文
評論
0/150
提交評論