《C语言从零开始C语言的基本结构.ppt》由会员分享,可在线阅读,更多相关《C语言从零开始C语言的基本结构.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章C語言從零開始(C語言的基本結構)1第二章 C語言從零開始(C語言的基本結構)在第一章中,相信讀者已經熟悉如何編譯C語言程式。在本章中,我們將透過一個非常簡單的C語言程式來說明C語言的程式結構。並且從本章開始,我們將實際撰寫每一個C語言範例程式,在撰寫程式之前,我們必須先提醒讀者以下幾件事。(1)寫程式就和學數學一樣,必須親手練習,每當讀者看完一個範例之後,請自行動手將程式內容一個字一個字的輸入到檔案中。並且詢問自己,本行程式的意義為何,是否可以略過以及改寫。除此之外,我們並不建議讀者強記各種指令敘述與語法細節,但由逐字輸入及練習撰寫程式的過程中,讀者將自然地記住這些指令敘述與語法。(2
2、)寫程式就像是堆積木一樣,任何一個大型程式都是由小型程式、函式或程式區塊所組成,因此當學習完畢本書所有範例時,不必懼怕開發中大型程式的挑戰,閱讀本書完畢,您應該具有開發1000行以上程式的能力。【註】:開發有效率的大型程式尚須要配合軟體工程的理論以及系統分析的能力,此時您可能需要更多有關於這方面的訓練。2大綱2.1 最簡單的C程式範例2.2 註解(comment)2.3 前置處理指令#include2.4 C程式的進入點main()函式2.5 敘述(statement)2.6 自由格式與空白字元2.7 深入C語言的文法【補充】2.8 本章回顧3下面是一個簡單的C程式範列,請逐字將之輸入到.c的
3、檔案中,慢慢培養屬於自己的程式風格。(若您的IDE已經幫您建立了某些預設內容,請先將它刪除後再輸入。)範例2-1:ch2_01.c(檔案位於隨書光碟 ch02ch2_01.c)。2.1 最簡單的C程式範例1234567891011121314/*/*檔名:ch2_01.c */*功能:簡單的C程式範例 */*/#include#include main(void)printf(歡迎使用C語言!n);printf(這是一個簡單的C程式.n);system(pause);42.1 最簡單的C程式範例執行結果:範例說明:雖然範例2-1是一個只有14行的C語言程式,但是卻說明了C程式的基本結構如下,我
4、們將分別加以說明。歡迎使用C語言!這是一個簡單的C程式.請按任意鍵繼續.52.1 最簡單的C程式範例圖2-1 C程式基本結構62.2 註解(comment)C的註解符號為/*.*/,在/*到*/之間的所有文字都將被編譯器忽略(事實上,註解將被前置處理器刪除後才輸入給編譯器),換句話說,沒有這些註解並不會影響程式的正確性。所以這些文字可以當作說明該程式或程式片斷之用,善用註解文字將有助於日後維護程式時,快速了解程式功用。(在程式的任何地方都可以加入註解)由於/*/具有換行功能,也就是可以將註解跨行描述,因此範例2-1的註解可以改寫如下。/*檔名:ch2_01.c *功能:簡單的C程式範例 */7
5、2.2 註解(comment)【謬誤】:由於/*/註解格式在編譯器中,會從第一個遇到的/*開始視為註解文字,直到遇到第一個*/為止,因此並不允許使用巢狀註解文字,例如下列的程式碼中,就犯了這個錯誤。【C+】:C+提供了另一種單行註解符號/,凡是/之後的整行文字都會被視為註解。/*外部註解*/*內部註解*/*外部註解*/錯誤的巢狀註解8在C語言中,前置處理指令是前面出現#符號的指令,嚴格說起來,前置處理指令並非C語言的指令,因為這些指令會在程式進行編譯之前,先被前置處理器(preprocessor)置換成某些程式碼,因此前置處理指令又稱為假指令。在此,我們先說明#include這個前置處理指令,
6、至於其他的前置處理指令,則留待後面章節中再做說明。#include的功用在於引入標頭檔,所謂標頭檔就是放置某些已經撰寫完成函式內容的函式庫檔案,這些標頭檔可能是由編譯器所提供,也可能是自行撰寫的函式庫。我們必須先引入標頭檔,才可以使用標頭檔內所提供的函式。例如:stdio.h標頭檔中定義了printf()與scanf()函式的內容,stdlib.h標頭檔中定義了system()函式的內容。因此,若我們在程式中要使用這些函式的話,就必須使用#include 及#include 將這些函式庫檔案引入。2.3 前置處理指令#include92.3 前置處理指令#include圖2-2 包含前置指令的
7、編譯過程102.3 前置處理指令#include#include引入標頭檔可分為下列兩種格式:#include xxx.h為C編譯器提供的標頭檔,並且存放在編譯器內定的目錄中,使用此種格式,前置處理器會自動到內定目錄中找到標頭檔。【註】:目前絕大部分的C編譯器都提供了ANSI C所規範的標頭檔及其函式,除此之外,某些編譯器還提供了一些特別的標頭檔函式庫,不過我們並不建議使用這些非ANSI C的函式,否則將會降低程式的可攜性。下列是所有ANSI C所規範的函式庫標頭檔名稱及功能。112.3 前置處理指令#include函式庫標頭檔名稱函式種類標準輸入與輸出字元分類測試字串處理與轉換數學函式標準函
8、式庫,提供各類基本函式例外偵測,有助於除錯引數串列的測試非區域跳躍訊號偵測提供各類時間函式 及 float.h提供浮點數的精確位數定義,limits.h提供某些極限值的定義ANSI C函式庫標頭檔12【函式庫的功能】:引入的函式庫會在前置處理時被載入,通常函式庫會記錄許多的函式,除此之外,函式庫也可能定義了某些符號常數,例如數學的無限大在電腦中根本無法完全實現,因此只能用可儲存的最大值來代表,例如INT_MAX代表在int資料型態下的最大值2147483647,而INT_MAX的定義也被包含在limits.h之中。2.3 前置處理指令#include132.3 前置處理指令#include#i
9、nclude ooo.hooo.h不是編譯器提供的標頭檔,所以程式設計師必須標明該檔案所在目錄,以便前置處理器取得該檔案。【解析與說明】:大多數由編譯器所提供的標頭檔,都會使用英文縮寫來表示該檔案所包含的函式庫類型,例如:math.h就是包含數學函式庫的標頭檔,stdio.h就是包含標準輸出入(standard input and output)的標頭檔,您最好根據此原則來命名自行撰寫的函式庫檔案,並於檔案內註解該檔案各函式庫的功用及各引數的規定,以便日後自行使用或提供他人使用。142.4 C程式的進入點main()函式C語言屬於模組化設計的一種語言,而C語言的模組則是以函式來加以表示。換句話
10、說,C程式是由各個不同功能的函式所組成,並且函式與函式之間可以透過呼叫以及回傳值方式加以聯繫,一個函式的基本定義格式如下:函式的基本格式為函式名稱(),由於函式可以於被呼叫時接受呼叫者傳入引數,因此這些引數必須在()內加以宣告,而函式也可以回傳資料給呼叫者,所以我們也必須在函式名稱前面宣告回傳值的資料型態(關於資料型態請見第三章)。函式的內容則是包含在與 之間。函式回傳值型態 函式名稱(傳入引數)函式內容(敘述群)15main()函式是命令列(Console Mode)C程式的進入點,換句話說,當我們在命令列式的作業系統中執行由C所撰寫的應用程式時,會先從main()函式開始執行。在範例2-1
11、中,我們將main函式宣告為main(void),其中將void寫在()內,代表該函式不接受傳入任何引數資料。若將之寫在函式名稱前,則代表該函式執行完畢後不回傳任何資料,例如:void main()。大多數的編譯器都接受省略void的宣告語法(但可能會出現warning警告訊息),也就是當省略宣告void時,自動判定為不接受傳入引數或函式不回傳資料。例如我們可以將範例2-1的main函式定義改寫如下:2.4 C程式的進入點main()函式main().void main().main(void).void main(void).16除了上述的介紹之外,main函式還具有以下兩個特點:(1)唯一
12、性:在C函式中,任何函式都具有唯一性,main函式也是如此。(2)必要性:為了讓作業系統能夠找到程式進入點,因此不可省略或缺少main函式。【解析】:本書以命令列式的C語言程式為說明主體,也就是以純粹指令模式(console mode)下的C程式為主要說明對象,若在Windows或Mac OS上的C/C+程式,則由於作業系統上層還包含一層複雜架構(Framework),因此,如果要設計視窗程式,則必須遵循Framework的設計規範,而這將改變C/C+程式的運作規則,例如:Windows下的C/C+程式進入點為WinMain()函式。【解析】:main函式的呼叫者為作業系統,因此範例2-1的程
13、式並不接受作業系統傳入引數,也不會回傳任何數值給作業系統。但有的時候作業系統會傳入引數給main函式,例如:我們撰寫一個可接受指定總球數及開獎球數的樂透程式,並將之編譯為lotto執行檔,此時可以在作業提示符號後面輸入lotto 42 7,來要求該程式以最大號碼42號的基本條件開出7個隨機號碼(6個基本號+1個特別號)。這個時候,我們就必須在main的()中宣告所接受的引數資料型態了(詳見第7章)。2.4 C程式的進入點main()函式17C語言是模組化設計,並利用區塊來撰寫程式內容,區塊的符號為,不論是函式、迴圈、決策都是使用區塊符號來包裝內容。而區塊內容則是由敘述(statement)所組
14、成,每一個敘述後面必須加入;做為結束。例如:範例2-1中,main函式內容共有3個敘述,分別是printf(歡迎使用C語言!n);、printf(這是一個簡單的C程式.n);及system(pause);。前兩個敘述都是呼叫printf()函式,()內的字串則是傳入printf()函式的引數,而printf()函式則已經定義在標頭檔中。最後的敘述是呼叫system()函式,()內的字串pause則是傳入system()函式的引數,代表要作業系統執行pause指令,而system()則定義於標頭檔中。執行結果中的請按任意鍵繼續執行結果中的請按任意鍵繼續.其實就是執行其實就是執行system(pa
15、use)的效果,它會等待使用者按下任意鍵之後才會繼續後面的動的效果,它會等待使用者按下任意鍵之後才會繼續後面的動作作,您可以開啟一個Dos環境,並且單獨輸入pause指令,看看會有什麼結果。2.5 敘述(statement)#include#include main(void)printf(歡迎使用C語言!n);printf(這是一個簡單的C程式.n);system(pause);182.5 敘述(statement)C語言的敘述除了函式呼叫之外,還有以下幾種類型,我們將在後面章節中加以說明:算式敘述(Expression Statement)複合敘述(Compound Statement)選
16、擇敘述(Selection Statement)迴圈敘述(Iteration Statement)標籤敘述(Labeled Statement)跳躍敘述(Jump Statement)算式敘述的結束符號非常重要不可省略,因為編譯器將以;做為一般敘述的結束(也有例外,例如for迴圈敘述),而不是以換行符號做為算式敘述的結束。而在範例2-1中,#include 沒有算式敘述結束符號,這是因為#include並非一個C算式敘述,而是前置處理指令,因此到了編譯階段時,並不存在該行程式碼。192.6 自由格式與空白字元C語言採用自由格式撰寫,換句話說,您可以去除程式中各敘述間的所有空白字元(spaces
17、、tabs等等)及換行符號(carriage、return),編譯器仍會正確編譯程式,例如:您可以將範例2-1中main的內容改寫如下:雖然省略空白字元以及換行符號能夠使得程式行數減少,但並不會加速程式的執行效率,因為不論是範例2-1的表示方法或上述表示方法,編譯器都將產生相同的輸出結果。不過上述的撰寫格式,則比範例2-1更難以閱讀。因此,為了日後維護的方便,強烈建議讀者應該培養程式碼縮排及適當換行的習慣。main(void)printf(歡迎使用C語言!n);printf(這是一個簡單的C程式.n);system(pause);202.6 自由格式與空白字元【解析】:內的空白字元則不會被編譯
18、器忽略,因為在C語言中,是用來表示字串。【常見的錯誤】:C程式和Unix/Linux作業系統一樣,對於字元的大小寫是有所區別的,因此您不能將main(void)改寫為Main(void)或MAIN(VOID)。212.7 深入C語言的文法【補充】C語言程式基本上仍舊是一個純文字檔案,因此是由眾多字元所構成,這些字元將會被編譯器的掃描程式分割為句元(Token)。這些句元可能代表的是關鍵字、保留字、識別字、運算子、變數名稱或資料值。眾多句元又可以組合成敘述(statement),敘述的結尾則是;。而眾多的敘述則成為函式內容。編譯器的剖析程式(parser)會針對C程式的敘述是否符合C語言的文法(
19、Grammar)加以判斷,若不符合文法,則會產生錯誤訊息。至於ANSI C語言的文法則列於附錄E中,它使用特殊的描述語法來表示,對於初次接觸程式語言的讀者來說,並不容易理解,因此,我們將在後面章節中,使用比較容易理解的格式來解說這些語法,讀者可以於學習完C語言後再回頭來看完整的C語言文法。22在本章中,我們學習到C程式的基本結構。本章所學習到的內容如下:(1)C程式的基本結構包含3大部分:程式註解、前置處理指令、函式及敘述(2)在C程式中,可使用/*/做為註解符號。(3)純文字模式的C程式進入點為 main()函式。(4)一般敘述以;做結尾。(5)C語言的輸出函式printf()的簡單使用方法如下(我們將在第四章中,說明printf()的進階使用方法)printf(輸出內容);2.8 本章回顧23(6)C語言執行作業系統環境的指令可以透過system()來執行,將想要執行的指令包裝為字串當作引數傳送給system()函式即可,格式如下。(並非所有的作業系統指令都可以用這個方式來執行,實際上還必須視作業系統與編譯器提供了哪些指令。)system(作業系統指令);在C程式結構中,除了上述的3大部分之外,還包含其他細節,例如:全域變數的宣告應該出現在其他函式宣告之外。這些細節,我們將於後面章節中分別加以介紹。2.8 本章回顧24本章習題25