天天看點

《21天學通C語言(第7版)》一2.2 程式的組成部分

本節書摘來自異步社群《21天學通c語言(第7版)》一書中的第2章,第2.2節,作者 【美】bradley jones , peter aitken , dean miller,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

21天學通c語言(第7版)

接下來,将逐行分析上面的程式示例。我們為程式清單中的每一行都添加了行号,以友善讀者定位和查找正在分析和讨論的部分。

main()函數位于程式清單2.1的第9~23行。在每個可執行的c程式中,main()函數必不可少。在最簡單的情況下,main()函數由函數名main、其後的一對圓括号(其中包含void)和一對花括号({})組成。在大多數編譯器中,省略圓括号中的void并不影響程式的運作。但是,ansi标準規定,應該在main後的圓括号中寫上void,以表示沒有給main函數發送任何消息。

花括号内的語句組成了程式的主體。在一般情況下,程式從main()的第1條語句開始執行,到main()的最後一條語句結束。根據ansi标準,main()中不能缺少return語句(第22行)。

include指令和#define指令分别位于程式清單2.1的第2行和第3行。#include指令指令c編譯器,在編譯時将包含檔案的内容添加程序式中。包含檔案(include file)是獨立的磁盤檔案,内含程式或編譯器要使用的資訊。這些包含檔案(也稱為頭檔案(header file))由編譯器提供。一般情況下都不用修改這些檔案中的内容,是以将其與源代碼分離。所有包含檔案的擴充名都是.h(如,stdio.h)。

使用#include指令,可以讓編譯器在編譯過程中将指定的包含檔案放入程式中。在程式清單2.1中,#include指令被解譯為“添加stdio.h檔案的内容”。幾乎所有的c程式都要包含一個或多個包含檔案。欲了解更多包含檔案的相關内容,請參閱第22課。

define指令指令c編譯器,在整個程式中用賦給指定項的值替換指定項。如果用#define在程式的頂部設定變量,不僅整個程式都能使用該項,而且在需要時可以很友善地更改該項。隻需修改#define一行,便可替換所有該項的值,省去了在程式中逐一查找修改的麻煩。例如,假設你編寫了一個工資單程式,用這種特殊的方法設定醫療保險(即,用#define設定health_insurance的值),在保險費率發生變化時,隻需修改該程式頂部(或頭檔案中)health_insurance的值即可。這比逐行查找相關代碼再逐一修改保險費率要簡單得多。我們将在第3課詳細介紹#define指令。

變量定義位于程式清單2.1的第5行。變量是賦給記憶體中某個位置的名稱,用于儲存資訊。在程式執行期間,程式使用變量儲存各種不同類型的資訊。在c語言中,必須先定義變量才能使用。變量定義告訴編譯器變量的名稱和待儲存資訊的類型。在上面的程式示例中,第5行int year1, year2;定義了兩個變量——分别名為year1和year2,每個變量都儲存一個整型值。第3課将詳細介紹變量和變量定義的内容。

函數原型位于程式清單2.1的第7行。函數原型(function prototype)出現在使用函數之前,将程式中所用函數的名稱和參數告知編譯器。函數原型與函數定義(function definition)不同,函數定義包含組成函數的實際語句(函數定義在2.2.6節中詳述)。

程式清單2.1的第12、13、14、17、19、20、22和28行都是程式語句。c程式的具體工作由它的語句來完成,如在螢幕上顯示資訊、讀取鍵盤的輸入、執行數學運算、調用函數、讀取磁盤檔案以及程式需要執行的其他操作。本書用大部分篇幅分析和講解各種c語句。就現在而言,你隻需記住:在源代碼中c語句通常占一行,并以分号結尾。接下來,将詳細講解bigyear.c中的語句。

(1) pri ntf()語句

printf()語句(第12、13、19和20行)是在螢幕上顯示資訊的庫函數。printf()語句可以顯示簡單的文本消息(如12和13行所示),也可以顯示帶有一個或多個變量值的消息(如第19行和第20行所示)。

(2) scanf()語句

scanf()語句(第14行)也是一個庫函數。它讀取從鍵盤輸入的資料,并将資料賦給程式中的一個或多個變量。

程式中第17行的語句,調用calcyear()函數。也就是說,該語句執行calcyear()函數中包含的程式語句。此外,year1作為參數被發送給函數。執行完calcyear()中的語句後,calcyear()向程式傳回一個值,該值被儲存在year2變量中。

(3) return語句

程式清單2.1中的第22行和第28行都是return語句。其中,第28行的return語句屬于calcyear()函數,該函數計算一個人到指定年齡時的年份,通過将#define定義的target_age加上變量year1,并将結果傳回調用calcyear()的程式。第22行的return語句,在程式結束前将0這個值傳回作業系統。

程式清單2.1中的函數定義在第26~29行。該程式中涉及了兩種類型的函數(庫函數和使用者自定義函數)。printf()和scanf()函數是庫函數,第26~29行的calcyear()函數是使用者自定義函數。顧名思義,使用者自定義函數由程式員在程式開發過程中編寫。calcyear()函數将建立的target_age與年份相加,并将結果(另一個不同的年份)傳回調用該函數的程式。在第5課中,你将學到正确使用函數是養成良好的c程式設計習慣的關鍵。

這裡要提醒讀者注意,在真正的c程式中,可能不會用函數完成諸如計算兩個數加法這樣簡單的任務。程式清單2.1這樣做隻是為了示範,友善讀者了解函數。

程式清單2.1中的第1、11、16和25行都是程式的注釋。程式中以/開始、以/結尾的部分,或者以//開始的單獨一行都稱為注釋(comment)。編譯器會忽略所有的注釋,無論你在注釋中寫任何内容,都不會影響程式的運作。第1種風格的注釋可寫成一行或多行(跨行)下面有3個示例:

注釋不能套嵌。把一條注釋放入另一條注釋中稱為嵌套(nested)注釋。大多數編譯器都不允許下面這樣的注釋:

然而,某些編譯器也允許套嵌注釋,雖然這看上去很不錯,但是請不要這樣做。因為c語言的優勢之一是可移植性,使用嵌套注釋這樣的特性可能會影響代碼的可移植性。除此之外,嵌套注釋還可能導緻一些難以發現的問題。

第2種風格的注釋以雙斜杠(//)開始,隻用于單行注釋。雙斜杠告訴編譯器忽略從雙斜杠後面至本行結尾的内容。

許多新手程式員都認為給程式加注釋浪費時間,完全沒必要加注釋。這樣想完全不對!在你寫代碼時,當然很清楚程式完成什麼操作。然而,随着程式越來越大、越來越複雜,或者你要修改半年前編寫的程式,就能展現注釋的價值所在。現在就養成好習慣,用注釋來說明程式設計的結構和操作。可以依自己喜好選擇任意一種風格的注釋。本書的程式中會用到這兩種風格的注釋。

《21天學通C語言(第7版)》一2.2 程式的組成部分

程式清單2.1中的花括号位于第10、23、27和29行。使用花括号({})将組成每個c程式(包括main()函數)的代碼行都括起來。用花括号括起來的一條或多條語句稱為塊(block)。學到本書後面的課程,你會發現c語言中的塊有許多用途。

花時間輸入、編譯并運作bigyear.c(程式清單2.1)。不要放過任何一個練習使用編輯器和編譯器的機會。回顧第1課中學過的步驟1。

1.確定程式設計的目錄正确。

2.打開編輯器。

3.對照程式清單2.1正确輸入bigyear.c源代碼,但不要輸入左側的行号和冒号。

4.儲存程式檔案。

5.輸入編譯器相應的指令編譯并連結該程式。如果未顯示任何錯誤消息,便可點選c環境中相應的按鈕運作程式。

6.如果出現錯誤消息,傳回第2步并更正錯誤。

計算機運作快速且準确,但它的确隻會“照本宣科”。計算機非常呆闆、缺乏想象力,對最簡單的拼寫錯誤也無能為力。它隻按照你輸入的内容執行,完全無視這些内容的含義!

c語言的源代碼也是如此。程式中一個簡單的拼寫錯誤會導緻c編譯器停止工作,甚至崩潰。幸運地是,雖然編譯器尚未智能到可以糾正你的小錯誤(人人都會犯錯!),但是,它能輕易地識别這些錯誤并報錯(第1課中介紹了編譯器如何報告錯誤消息和如何解譯它們)。

繼續閱讀