C語言程序設(shè)計課件_第1頁
C語言程序設(shè)計課件_第2頁
C語言程序設(shè)計課件_第3頁
C語言程序設(shè)計課件_第4頁
C語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩246頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)類型、運算符與運算式本章著重講述5個方面的內(nèi)容:(1)C語言的基本數(shù)據(jù)類型。(2)C語言認可的常量及其表示法。(3)C語言中變數(shù)的數(shù)據(jù)類型、存儲類型。(4)完整變數(shù)說明的組成。(5)C語言裏的運算符和由它們組成的運算式。2.1C語言的數(shù)據(jù)類型 程式中涉及的各種數(shù)據(jù)(常量、變數(shù)),都必須存放在記憶體裏。所謂一個數(shù)據(jù)的“數(shù)據(jù)類型”,是該數(shù)據(jù)自身的一種屬性,它告訴編譯程序,這個數(shù)據(jù)要在內(nèi)存中佔用多少個位元組。 不同類型數(shù)據(jù)所佔用的記憶體區(qū)域大小是不同的,這個區(qū)域的位元組數(shù)被稱為是這種數(shù)據(jù)類型的“長度”。表2-1列出了C語言中基本數(shù)據(jù)類型的長度。2.2常量 所謂“常量”,就是指在程式執(zhí)行過程中,其值不能改變的量。C語言裏有如下幾種常量:整型常量、實型常量、字元常量和字串常量。一個常量的類型,由它的書寫格式確定,無須事先加以說明。使用時,在程式需要的地方直接寫出來即可。2.2.1整型常量 值為整數(shù)的常量稱為“整型常量”,簡稱“整常量”,它包括正整數(shù)、零和負整數(shù)。整常量的數(shù)據(jù)類型當然是整型(int)的。 整常量可以以十進位、八進制和十六進制的書寫形式出現(xiàn)在C語言的程式裏。(1)十進位整常量的書寫形式 十進位整常量就是通常意義下的整數(shù)。(2)八進制整常量的書寫形式 八進制整常量是在通常意義下的八進制整數(shù)前加上首碼數(shù)字“0”構(gòu)成。(3)十六進制整常量的書寫形式 十六進制整常量是在通常意義下的十六進制整數(shù)前加上首碼“0x”(數(shù)字0和小寫字母x)構(gòu)成。 整型或短整型常量屬於整型。由表2-1知,它們需要佔用記憶體的2個位元組。在電腦中存放時,是將其數(shù)值轉(zhuǎn)換成相應(yīng)的二進位數(shù),放在兩個位元組(16個二進位位)裏,因此其數(shù)值範圍是十進位的?32768~+32767;長整型常量需要佔用記憶體的4個位元組。在電腦中存放時,是將其數(shù)值轉(zhuǎn)換成相應(yīng)的二進位數(shù),放在四個位元組(32個二進位位)裏,因此其數(shù)值範圍是十進位的?2147483648~+2147483647。如果是長整型常量,那麼在程式中書寫時,需要在它的末尾加上尾碼:小寫的字母“l(fā)”,或大寫的字母“L”,以便與整型或短整型常量區(qū)分開來。2.2.2實型常量 值為實數(shù)的常量稱為“實型常量”,簡稱“實常量”。在C語言中,整常量有十進位、八進制和十六進制3種書寫形式。但是對於實常量而言,只有十進位一種書寫形式,沒有八進制和十六進制的實常量。 在C語言中表示十進位的實常量,可以採用一般形式與指數(shù)形式兩種辦法。(1)一般形式的實常量 一般形式的實常量就是通常意義下的實數(shù),它由整數(shù)、小數(shù)點和小數(shù)3部分構(gòu)成。(2)指數(shù)形式的實常量 指數(shù)形式的實常量由尾數(shù)、小寫字母e或大寫字母E以及指數(shù)3部分構(gòu)成。 可以用不同的尾數(shù)和指數(shù),表示同一個實數(shù)。如果尾數(shù)部分被寫成小數(shù)點前有且僅有一位非0數(shù)字,那麼就稱它為“規(guī)範化的指數(shù)形式”。2.2.3字元常量 在C語言中,用單引號前、後括住的單個字元被稱為“字元常量”。 程式中書寫字元常量時,雖然要用單引號前、後把它括住,但單引號只起一個標識作用,並不算作字元常量的組成部分。在內(nèi)存中,將開闢一個位元組(8個二進位位)來存放字元,存放的內(nèi)容是該字元的ASCII碼值。2.2.4字串常量 在C語言中,用雙引號前、後括住的零個或若干個字元,被稱為“字串常量”,簡稱“字串”。 一個字串中所包含的字元個數(shù),稱為該“字串的長度”。 在C語言中,總是為每一個字串多分配1個位元組來存放它。在順序存放完字串裏的字元後,往最後一個位元組裏存放一個ASCII碼值為0的字元,用以標識該字串的結(jié)束。2.3簡單變量 在程式執(zhí)行過程中,允許其值發(fā)生變化的量,被稱為“變數(shù)”。 用戶應(yīng)該為程式中用到的每一個變數(shù)起一個名字,以示區(qū)別,為變數(shù)取的名字,稱為“變數(shù)名”。在C語言中,為變數(shù)起名應(yīng)符合識別字的命名規(guī)則,因此,變數(shù)名只能以字母或下劃線開頭。2.3.1變數(shù)的數(shù)據(jù)類型 在程式中使用一個變數(shù)之前,先要對它進行說明:起一個名字(變數(shù)名),指定它的數(shù)據(jù)類型。變數(shù)說明語句的基本格式是:<數(shù)據(jù)類型符><變數(shù)名>;1.整型變數(shù)的說明 用數(shù)據(jù)類型符int,可以將一個變數(shù)說明為是整型的。比如:intx; 說明了一個名為x的變數(shù),它的數(shù)據(jù)類型是整型的。由這個說明,表示x要在內(nèi)存佔用2個位元組來存放它的值,它的取值範圍是?32768~+32767。2.實型變數(shù)的說明 用數(shù)據(jù)類型符float或double,可以將一個變數(shù)說明為是單精確度實型的或雙精度實型的。比如:

floatx;doublent; 這兩個變數(shù)說明語句,第1個把x說明為是單精確度實型的,它需要4個位元組來存放自己的取值;第2個把nt說明為是雙精度實型的,它需要8個位元組來存放自己的取值。3.字元型變數(shù)的說明 用數(shù)據(jù)類型符char,可以將一個變數(shù)說明為是字元型的。比如:

charch; 說明變數(shù)ch是字元型的,它要在內(nèi)存中佔用1個位元組,來存放它的ASCII碼值。關(guān)於變數(shù)的數(shù)據(jù)類型說明,有如下幾點要注意。(1)切記任何一個變數(shù)都要遵循“先說明後使用”的原則。(2)在一個變數(shù)說明語句中,可以同時說明多個相同數(shù)據(jù)類型的變數(shù)。(3)變數(shù)數(shù)據(jù)類型說明可以放在所有函數(shù)的外面,也可以放在函數(shù)裏面。(4)在同一個函數(shù)中說明變數(shù)時,變數(shù)名不能相同。(5)在C語言中,只有字串常量,沒有字串型的變數(shù)。之所以這樣,是因為C認為任何一種數(shù)據(jù)類型的長度都應(yīng)該是一定的,但字串的長度卻不能確定,所以不能有這種數(shù)據(jù)類型的變數(shù)。2.3.2變數(shù)的存儲類型 系統(tǒng)分給用戶使用的記憶體空間,有3個部分: 應(yīng)用程式區(qū)——用於存放用戶程式。 靜態(tài)存儲區(qū)——用於存放在程式執(zhí)行的全部過程中,都需要保存的那些數(shù)據(jù)。 動態(tài)存儲區(qū)——用於存放在程式執(zhí)行時,臨時需要保存的那些數(shù)據(jù)。 為了說明一個變數(shù)的存儲類型,只需在變數(shù)說明語句裏添加存儲類型符即可。這時的變數(shù)說明語句格式成為:<存儲類型符><數(shù)據(jù)類型符><變數(shù)名>;1.自動型變數(shù) C語言在動態(tài)存儲區(qū)裏為其分配存儲區(qū)。對於自動變數(shù),有如下幾點要注意。 (1)自動變數(shù)只能在函數(shù)內(nèi)說明。 (2)如果一個變數(shù)是自動型的,那麼保留字auto可以省略不寫。 (3)在不同函數(shù)中說明的自動變數(shù),可以使用相同的名字,它們的類型可以相同,也可以不同,彼此不會產(chǎn)生干擾。2.寄存器型變數(shù) 現(xiàn)實程式中極少使用寄存器型變數(shù)。3.靜態(tài)型變數(shù) 把存儲類型符static加在變數(shù)名及其類型前面,該變數(shù)就成為一個靜態(tài)型變數(shù),簡稱“靜態(tài)變數(shù)”。C語言在靜態(tài)存儲區(qū)裏為靜態(tài)變數(shù)分配存儲區(qū)。 對於靜態(tài)變數(shù),要注意的是: (1)靜態(tài)變數(shù)可以在函數(shù)內(nèi)部說明,也可以在函數(shù)外部說明。 (2)在整個程式運行期間,靜態(tài)變數(shù)一直佔據(jù)分配給它的存儲區(qū)不予歸還,直到程式運行結(jié)束。4.外部型變數(shù)2.3.3變數(shù)的初始化與完整的變數(shù)說明語句 在對變數(shù)進行說明的同時給變數(shù)賦予值,稱為“變數(shù)的初始化”。這樣,一個完整的變數(shù)說明語句有如下的格式:<存儲類型符><數(shù)據(jù)類型符><變數(shù)名>=<常量>; 對於自動(auto)型和寄存器(register)型變數(shù),如果在說明時進行初始化,那麼每次運行到該變數(shù)所在的函數(shù)時,都會隨之而再次被初始化;如果在說明時沒有進行初始化,那麼在執(zhí)行到第一次賦予它值的語句之前,它的值是不確定的(也就是它的存儲單元裏的內(nèi)容是不要確定的)。 對於在函數(shù)內(nèi)說明的靜態(tài)(static)型變數(shù),如果在說明時進行初始化,那麼這個初始化的工作只在第一次運行時進行。下次再運行到該變數(shù)所在的函數(shù)時,不會重新初始化,而是繼承上次運行後保留的當前值參與這次運算;如果在說明時沒有進行初始化,那麼C編譯程序會自動為其進行初始化:將整型(int)變數(shù)賦予初值0,將實型(float、double)變數(shù)賦予初值0.0,將字元(char)型變數(shù)賦予初值空字元(即ASCII碼值為0的字元'\0')。下次再運行到該變數(shù)所在的函數(shù)時,不會重新初始化,而是繼承上次運行後保留的當前值參與這次運算。2.3.4變數(shù)地址與取地址符“&” 在程式中說明了一個變數(shù)之後,記憶體就會有一個存儲區(qū)與之對應(yīng)。這個存儲區(qū)的第1個位元組的地址,就稱為是該變數(shù)的“地址”。C語言裏,一個變數(shù)的地址只能通過在變數(shù)前加“&”符號來得到,稱其為“取地址符”。2.4C語言的運算符與各種運算式 用來表示各種運算的符號稱為“運算符”。 用運算符把運算對象連接在一起所組成的式子,稱為“運算式”。 當運算式中有多個運算符時,先做哪個運算,後做哪個運算,必須遵循一定的規(guī)則,這種運算符執(zhí)行的先後順序,稱為“運算符的優(yōu)先順序”。在C語言中,同級別運算符可以有兩種結(jié)合性。所謂結(jié)合性是“自左向右”的,意即由左向右遇到誰就先做誰;所謂結(jié)合性是“自右向左”的,意即由右向左遇到誰就先做誰。2.4.1算術(shù)運算符與算術(shù)運算式1.除法運算符:/ 該運算符的運算規(guī)則與運算對象的數(shù)據(jù)類型有關(guān):如果兩個運算對象都是整型的,則結(jié)果是取商的整數(shù)部分,舍去小數(shù)(也就是做整除);如果兩個運算對象中至少有一個是實型的,那麼結(jié)果是實型的,即是一般的除法。2.模運算符:% 該運算符的兩個運算對象必須是整型的,結(jié)果是整除後的餘數(shù)(即求餘),符號與被除數(shù)相同。3.增1、減1運算符:++和-- 增1、減1運算符都是單目運算符,其運算對象只能是變數(shù),且變數(shù)的數(shù)據(jù)類型限於整型、字元型,以及以後要學習的指針型、整型數(shù)組元素等。增1、減1運算符實施的具體操作是自動將運算對象實行加1或減1,然後把運算結(jié)果回存到運算對象中。增1、減1運算符與眾不同之處在於它們既能出現(xiàn)在運算對象之前,比如:++i,--j,成為所謂的“首碼運算符”;也能出現(xiàn)在運算對象之後,比如:x++,y--,成為所謂的“尾碼運算符”。 首碼式增1、減1運算符和尾碼式增1、減1運算符之間的差別在於實施其增、減操作的時間。首碼式增1、減1運算符,是先對運算對象完成加、減1和回存操作,然後才能使用該運算對象的值;尾碼式增1、減1運算符,是先使用該運算對象的值,然後才去完成加、減1和回存操作。對於這種前、尾碼差異的正確理解是非常重要的。2.4.2賦值運算符與賦值運算式 表2-5列出了C語言中的基本賦值運算符和一組算術(shù)自反賦值運算符及它們的含義。算術(shù)自反賦值運算符對我們來說是一組新的運算符,但理解它們不會感到困難。表2-5 C語言的賦值運算符1.基本賦值運算符:=

<變數(shù)>=<運算式> 其含義是先計算賦值號“=”右邊<運算式>的值,然後把計算的結(jié)果賦給(即存入)左邊的<變數(shù)>。上述式子即是一個運算式,稱為“賦值運算式”。在賦值運算式的後面加上分號(即語句結(jié)束符),就成為一個賦值語句。2.算術(shù)自反賦值運算符:+=、?=、*=、/=和%= 算術(shù)自反賦值運算符的作用是把“運算”和“賦值”兩個動作結(jié)合起來,成為一個複合運算符。其形式為:

<變數(shù)>+=<運算式> 其含義是先把運算符左邊<變數(shù)>的當前值與右邊<運算式>的值進行“+”運算,然後把運算結(jié)果賦給(即存入)左邊的變數(shù)。2.4.3關(guān)係運算符與關(guān)係運算式 表2-6列出了C語言中的關(guān)係運算符及其含義。表2-6 C語言的關(guān)係運算符 所有關(guān)係運算符都是雙目的。用關(guān)係運算符將兩個運算對象連接起來所形成的運算式,稱為“關(guān)係運算式”。關(guān)係運算符的作用是對其左、右兩個運算對象進行比較,測試它們之間是否具有所要求的關(guān)係。關(guān)係運算式的最終結(jié)果是邏輯值:如果關(guān)係成立,則運算式取邏輯值“真”,用數(shù)值1表示;如果關(guān)係不成立,則運算式取邏輯值“假”,用數(shù)值0表示。2.4.4邏輯運算符與邏輯運算式 表2-7列出了C語言中的邏輯運算符及其含義。表2-7 C語言的邏輯運算符1.邏輯非運算符:! 邏輯非的運算結(jié)果是得到運算對象的“反”。2.邏輯與運算符:&& 只有當兩個運算對象同時為真時,整個邏輯運算式的值才為真;只要其中有一個為假,整個邏輯運算式的值就是假。3.邏輯或運算符:|| 只要兩個運算對象中有一個為真時,整個邏輯運算式的值就是真;只有兩個運算對象同時為假時,整個邏輯運算式的值才是假。 要把多個簡單的條件組合形成複雜的條件,就必須利用邏輯運算符。關(guān)於邏輯運算符,要注意如下幾點:(1)在參加邏輯運算時,用非0值表示邏輯真,而邏輯運算的結(jié)果是用數(shù)值1來表示邏輯真;至於邏輯假,無論是參與邏輯運算時還是求得的運算結(jié)果,都是以數(shù)值0來表示的。(2)對於&&運算符,只要其左邊的運算對象為假,則整個運算式肯定取值“假”(數(shù)值0),C編譯程序不會再對右邊的運算對象進行求值。(3)對於||運算符,只要其左邊的運算對象為真,則整個運算式肯定取值“真”(數(shù)值1),C編譯程序不會再對右邊的運算對象進行求值。2.4.5條件運算符與條件運算式 在C語言裏,由“?”和“:”兩個符號組合成條件運算符,它是C語言裏唯一的一個三目運算符。使用時的一般形式為:<運算式1>?<運算式2>:<運算式3> 其中,第1個運算對象<運算式1>是一個邏輯運算式,第2、3個運算對象<運算式2>和<運算式3>的類型必須相同。由此而構(gòu)成的整個運算式,稱為“條件運算式”。 該運算符的含義是:先計算<運算式1>的值。如果它的值為真(非0),則整個條件運算式以<運算式2>的值作為自己的值;如果它的值為假(0),則整個條件運算式以<運算式3>的值作為自己的值??梢?,<運算式1>起到一個判定作用,整個條件運算式要根據(jù)它的值來決定自己的最終取值。2.4.6逗號運算符與逗號運算式 逗號運算符就是把逗號(,)作為運算符,利用它來把若干個運算式“連接”在一起。這樣構(gòu)成的運算式整體,稱為“逗號運算式”。逗號運算式的一般形式為:<運算式1>,<運算式2>,<運算式3>,…,<運算式n> 逗號運算式的執(zhí)行過程是:從左到右順序計算諸運算式的值,並且把最右邊運算式的值作為該逗號運算式的最終取值。2.4.7位運算符1.位邏輯運算符 表2-9列出了C語言中的位邏輯運算符及其含義。 由位邏輯運算符和運算對象構(gòu)成的運算式,稱為“位邏輯運算式”。表2-9 C語言的位邏輯運算符2.移位運算符 表2-10列出了C語言中的移位運算符及其含義。 “左移”和“右移”兩個移位運算符都是雙目的。由移位運算符和運算對象構(gòu)成的運算式,稱為“移位運算式”。表2-10 C語言的移位運算符(1)左移位運算符:<< 由左移位運算符構(gòu)成的移位運算式一般為:

運算式<<n 其中“運算式”是進行移位的對象,“n”指明移位的次數(shù)。功能是把左邊運算式裏以二進位形式給出的值向左移動n位,左邊移出的位丟棄,右邊空出的位補0。(2)右移位運算符:>> 由右移位運算符構(gòu)成的移位運算式一般為:

運算式>>n 其中“運算式”是進行移位的對象,“n”指明移位的次數(shù)。功能是把左邊運算式裏以二進位形式給出的值向右移動n位,右邊移出的位丟棄,如果運算對象是無符號數(shù),則空出的位用數(shù)字0填補;如果運算對象是帶符號數(shù),則空出的位用符號位內(nèi)容填補。3.位自反賦值運算符 表2-11列出了C語言中的位自反賦值運算符及其含義。表2-11 C語言的位自反賦值運算符2.4.8運算式中數(shù)據(jù)類型的轉(zhuǎn)換 當計算運算式時,C語言是這樣來處理“運算式裏的各個變數(shù)的數(shù)據(jù)類型不一致”的問題的:把參加運算的數(shù)據(jù)都自動轉(zhuǎn)換成數(shù)據(jù)長度最長的數(shù)據(jù)類型,然後進行計算。計算後的結(jié)果仍然保持數(shù)據(jù)長度最長的數(shù)據(jù)類型。 當把運算式的計算結(jié)果賦予變數(shù)時,C語言是這樣來處理“結(jié)果的數(shù)據(jù)類型與左邊變數(shù)的數(shù)據(jù)類型不一致”的問題的:把結(jié)果的數(shù)據(jù)類型自動轉(zhuǎn)換成變數(shù)的數(shù)據(jù)類型,然後賦予該變數(shù)。 在編寫程式時,如果有必要的話,程式設(shè)計人員也可以使用C語言提供的強制式數(shù)據(jù)轉(zhuǎn)換方式,以得到自己所希望的數(shù)據(jù)類型。 強制式數(shù)據(jù)轉(zhuǎn)換的一般格式是:

(<數(shù)據(jù)類型符>)(<運算式>)第3章C語言程式設(shè)計的三種基本結(jié)構(gòu)本章著重講述4個方面的內(nèi)容:(1)字元輸入/輸出函數(shù)。(2)格式輸入/輸出函數(shù)。(3)C語言中的各種選擇語句。(4)C語言中的各種迴圈語句。3.1順序結(jié)構(gòu)程式設(shè)計 如果程式中的若干語句是按照書寫的順序執(zhí)行,那麼這段程式的結(jié)構(gòu)就是順序式的。 C語言沒有輸入/輸出語句。C語言中的輸入/輸出功能,都是通過調(diào)用系統(tǒng)提供的輸入/輸出函數(shù)來實現(xiàn)的。3.1.1賦值語句、複合語句、空語句1.賦值語句 在賦值運算式的後面,加上一個語句結(jié)束符“;”,就形成了一個賦值語句。其一般格式是:

<變數(shù)>=<運算式>; 功能是計算出賦值運算符“=”右邊運算式的值,然後將該值賦予左邊的變數(shù)。 賦值語句也可以有如下格式:

<變數(shù)>@=<運算式>; 其中@=是一個算術(shù)或位自反賦值運算符。功能是將左邊的變數(shù)和右邊的運算式進行指定的算術(shù)或位運算後,將所得的值賦予左邊的變數(shù)。2.複合語句 在C語言程式中,可以用一對花括弧把若干條語句括起來,形成一個整體。這個整體就被稱為“複合語句”。從語法上講,它相當於一個語句。複合語句的一般格式是: { 語句; 語句; } 要注意,複合語句中可以出現(xiàn)變數(shù)說明,複合語句中的最後一條語句的語句結(jié)束符(分號)不能省略,否則會造成語法錯誤。另外,標識複合語句結(jié)束的右花括弧的後面不能有語句結(jié)束符(分號)。3.空語句 在C語言中,稱僅由一個分號組成的語句為“空語句”,即:

; 編譯程序在遇到空語句時,不會為其產(chǎn)生任何相應(yīng)的指令代碼。這就是說,空語句不執(zhí)行任何操作。因此,空語句只是C語言語法上的一個概念,它起到一個語句的作用,僅此而已。3.1.2字元輸入/輸出函數(shù)1.字元輸入函數(shù):getchar() 調(diào)用形式:getchar() 函數(shù)功能:使程式處於等待用戶從鍵盤進行輸入的狀態(tài)。輸入以在鍵盤上按回車換行鍵(Enter)結(jié)束,隨之返回輸入的第1個字元。該函數(shù)沒有參數(shù)。 在程式中使用該函數(shù)的一般形式是:

<變數(shù)>=getchar();2.字元輸出函數(shù):putchar() 調(diào)用形式:putchar(c),其中c為該函數(shù)的參數(shù),通常是一個已經(jīng)賦值的字元型變數(shù),或是一個字元常量。 函數(shù)功能:將字元變數(shù)c裏的內(nèi)容或字元常量在顯示器上顯示(即輸出)。 在程式中使用該函數(shù)時的一般形式是:

putchar(<字元變數(shù)名>);或 putchar(<字元常量>);3.1.3格式輸入/輸出函數(shù)1.格式輸入函數(shù):scanf() 調(diào)用形式:

scanf( <格式控制字串>, <輸入地址列表> ) 該函數(shù)有兩個參數(shù)。其中參數(shù)<格式控制字串>是用雙引號括起的一個字串常量。 字串中可以有兩部分內(nèi)容:一個是在輸入數(shù)據(jù)時起分隔數(shù)據(jù)作用的一般字元。因此輸入時,這部分字元用戶必須按照原樣從鍵盤鍵入。另一個是若干個以%開頭,後面跟隨格式字元的格式說明,由它們指出數(shù)據(jù)輸入時採用的不同格式。當使用scanf()函數(shù)輸入多個數(shù)據(jù)時,最重要的是判斷一個數(shù)據(jù)的輸入是否結(jié)束。這可以有下麵的幾種方法。方法1:在scanf()的格式控制字串裏安排起數(shù)據(jù)分隔作用的一般字元。這時,用戶輸入時,必須按照安排,鍵入這些一般字元。方法2:在scanf()的格式控制字串裏不安排任何數(shù)據(jù)分隔符號,這時C語言就默認使用空白字元、跳位字元(Tab鍵)、回車換行符(Enter鍵)作為每一個數(shù)據(jù)輸入完畢的分隔符號。方法3:在格式符前冠以附加格式符,指明輸入數(shù)據(jù)的域?qū)挘ㄕ麛?shù))。2.格式輸出函數(shù):printf() 調(diào)用形式:printf(<格式控制字串>,<輸出變數(shù)列表>); 該函數(shù)有兩個參數(shù)。其中參數(shù)<格式控制字串>是用雙引號括起的一個字串常量。字串中可以有兩部分內(nèi)容:一個是要求函數(shù)原樣輸出的一般字元;一個是若干個以“%”開頭、後面跟隨格式字元的格式說明,由它們規(guī)定所要輸出的數(shù)據(jù)所採用的格式。參數(shù)<輸出變數(shù)列表>列出了需要輸出的變數(shù)名(或運算式),正是它們的內(nèi)容要按照格式說明的規(guī)定加以輸出。3.2選擇結(jié)構(gòu)程式設(shè)計3.2.1if單分支選擇語句 if單分支選擇語句的一般格式是:

if(<條件>) <語句>;功能:在程式執(zhí)行過程中遇到if時,若圓括號裏的<條件>取值為非0(條件成立),則執(zhí)行<語句>;否則(即是值為0,條件不成立)不執(zhí)行if中的<語句>,而去執(zhí)行該單分支選擇語句的後續(xù)語句。注意,如果在條件成立時所要做的事情需要用幾條語句來表達,那麼格式中的<語句>就應(yīng)該以複合語句的形式出現(xiàn)。if單分支選擇語句的整個執(zhí)行流程,如圖3-5(a)所示。圖3-5if單分支選擇語句3.2.2if…else雙分支選擇語句 if…else雙分支選擇語句的一般格式是:

if(<條件>) <語句1>;

else <語句2>; 功能:在程式中遇到if時,若圓括號裏的<條件>取值為非0(條件成立),則執(zhí)行<語句1>;否則(即是值為0,條件不成立)執(zhí)行<語句2>。無論執(zhí)行的是<語句1>還是<語句2>,隨後都去執(zhí)行後續(xù)語句。注意,格式中代表兩個分支的<語句1>或<語句2>,都可以以複合語句的形式出現(xiàn)。if…else雙分支選擇語句的整個執(zhí)行流程,如圖3-7(a)所示。圖3-7if…else雙分支選擇語句3.2.3if…elseif多分支選擇語句 if…elseif多分支選擇語句的一般格式是:

if(<條件1>)<語句1>;

elseif(<條件2>)<語句2>;

elseif(<條件3>)<語句3>;

elseif(<條件n-1>)<語句n-1>;else<語句n>;...功能:在程式中遇到if時,若圓括號裏的<條件1>取值為非0(條件成立),則執(zhí)行<語句1>;否則去判定elseif後面圓括號裏<條件2>,如果值為非0(條件成立),則執(zhí)行<語句2>;否則去判定下一個elseif後面圓括號裏<條件3>的值,如果值為非0(條件成立),則執(zhí)行<語句3>;如此等等。如果<條件1>、<條件2>、<條件3>、…、<條件n?1>都為0(不成立),那麼執(zhí)行else後面的<語句n>。在執(zhí)行了<語句1>或<語句2>或<語句3>…或<語句n>後,去執(zhí)行後續(xù)語句。 注意,格式中的<語句1>、<語句2>、…、<語句n>等,都可以以複合語句的形式出現(xiàn)。if…elseif多分支選擇語句的整個執(zhí)行流程,如圖3-8(a)所示。圖3-8if…elseif多分支選擇語句3.2.4if語句的嵌套結(jié)構(gòu) 在各種if選擇結(jié)構(gòu)裏,其分支語句本身也可以是一個if選擇結(jié)構(gòu)語句。這就是所謂的“if語句的嵌套結(jié)構(gòu)”。由於在這種語句中,可能會出現(xiàn)許多個if和else,因此必須注意if和else之間的匹配問題。原則上,else總是與它最近的if配對。3.2.5switch多分支選擇語句 switch多分支選擇語句的一般格式是:

switch(<運算式>){

case常量值1:<語句1>;

break;case常量值2:<語句2>;

break;case常量值n-1:<語句n-1>;break;default:<語句n>;break;}...功能:首先計算switch後圓括號內(nèi)的運算式值,然後用該值逐個去與case後的常量值進行比較。當找到相匹配的值時,就執(zhí)行其後的語句。隨之接著繼續(xù)執(zhí)行後面case裏的語句。只有在對所有case後的常量值的比較,都找不到匹配者時,才去執(zhí)行default(如果有的話)後的語句。在執(zhí)行匹配case後的語句中,如果遇到break語句,則不再繼續(xù)後面的執(zhí)行,而是立即跳出switch語句,去執(zhí)行switch的後續(xù)語句。所以,break語句的功能是終止switch語句的執(zhí)行。圖3-9給出了switch語句的執(zhí)行流程。圖3-9switch語句的執(zhí)行流程對switch語句有如下幾點說明。(1)switch後面的運算式必須用圓括號括住,其取值必須是整型或字元型的。(2)各case後面的常量值必須是整數(shù)或一個字元常量,並且它們不應(yīng)該相同。(3)執(zhí)行完case後面的語句,如果沒有遇到break,那麼switch語句就會自動去執(zhí)行下一個case後面的語句,而不去判別與其常量值是否匹配。(4)如果語句中安排有default,那麼通常都把它安排在switch語句的最後。3.3迴圈結(jié)構(gòu)程式設(shè)計3.3.1while迴圈語句 while迴圈語句的一般結(jié)構(gòu)是:

while(<條件>) <語句>; 功能:在程式中遇到while時,首先檢查<條件>是否成立。如果成立,就執(zhí)行<語句>(通常稱為“循環(huán)體”),然後再去檢查<條件>是否成立;如果<條件>不成立,則終止迴圈,去執(zhí)行while語句的後續(xù)語句。構(gòu)成循環(huán)體的<語句>,可以是複合語句。圖3-12是while語句的執(zhí)行流程。圖3-12while語句的執(zhí)行流程3.3.2do…while迴圈語句 do…while迴圈語句的一般結(jié)構(gòu)是:

do { <語句>; }while(<條件>); 功能:在程式中遇到do時,就直接執(zhí)行<語句>(即循環(huán)體),然後才去檢查<條件>是否成立。如果跟隨在while後面的<條件>成立,則繼續(xù)執(zhí)行<語句>;如果不成立,則終止迴圈,去執(zhí)行do…while語句的後續(xù)語句。構(gòu)成循環(huán)體的<語句>,可以是複合語句。圖3-14是do…while語句的執(zhí)行流程。圖3-14do…while迴圈語句的流程3.3.3for迴圈語句 for迴圈語句的一般結(jié)構(gòu)是:

for(<運算式1>;<運算式2>;<運算式3>)<語句>;功能:先計算<運算式1>,通常是為迴圈變數(shù)指定初值(在整個迴圈過程中,它只做一次)。然後計算<運算式2>,判定它的值是否為非0(成立)。如果其值不為0,表示迴圈條件為真,則進入循環(huán)體,執(zhí)行<語句>(可以是複合語句);如果其值為0,表示迴圈條件為假,則終止迴圈,去執(zhí)行for迴圈語句的後續(xù)語句。在執(zhí)行完循環(huán)體後,就去計算<運算式3>。<運算式3>通常是對迴圈條件施加修改。隨後就又重新計算<運算式2>,以便判定是否進入下一個迴圈。圖3-17是for語句的執(zhí)行流程。圖3-17for迴圈語句的流程(1)for語句中的<運算式1>和<運算式3>都可以是逗號運算式。(2)for語句中迴圈變數(shù)的值可以遞增變化,也可以遞減變化。(3)for語句中的<運算式2>,可以不涉及對迴圈變數(shù)的測試,它能夠是任何合法的C運算式。語句中的<運算式1>、<運算式3>甚至都可以略去不要。3.3.4break和continue語句1.break語句 break語句的一般形式是:

break; 功能:該語句只能用於C程式中的兩個場合,一是用在switch多分支選擇結(jié)構(gòu)中,當某個case後的語句執(zhí)行完、遇到break語句時,就跳出switch結(jié)構(gòu);一是用在任何一種迴圈結(jié)構(gòu)中,如果遇到break,則立即結(jié)束整個迴圈,跳到本迴圈外、該迴圈後續(xù)語句的地方去執(zhí)行。2.continue語句 continue語句的一般形式是:

continue; 功能:在迴圈結(jié)構(gòu)裏遇到它時,就跳過循環(huán)體中位於它後面的其他語句,提前結(jié)束本次迴圈,並去判斷迴圈控制條件,以決定是否進入下一次迴圈。注意,該語句只能使用在C語言的迴圈結(jié)構(gòu)中。3.3.5迴圈的嵌套結(jié)構(gòu) 如果在一個迴圈結(jié)構(gòu)的循環(huán)體內(nèi),又出現(xiàn)了一個迴圈結(jié)構(gòu),那麼這就是所謂的“迴圈的嵌套結(jié)構(gòu)”,有的書上稱其為多重迴圈。既然是嵌套式的結(jié)構(gòu),那就表明各迴圈之間只能是“包含”關(guān)係,即一個迴圈結(jié)構(gòu)完全在另一個迴圈結(jié)構(gòu)的裏面。通常把裏面的迴圈稱為“內(nèi)迴圈”,外面的迴圈稱為“外迴圈”。第4章數(shù)組本章著重講述3個方面的內(nèi)容:(1)一維數(shù)組。(2)二維數(shù)組。(3)字元數(shù)組和字串。4.1數(shù)組的基本概念 所謂“數(shù)組”,就是只用一個名字去代表相同數(shù)據(jù)類型元素的一個有序集合,並用對應(yīng)的序號,來區(qū)分這個集合中的一個個元素。所起的名字,稱為“數(shù)組名”,序號稱為數(shù)組元素的“下標”。用一個下標來區(qū)分其元素的數(shù)組,稱為“一維數(shù)組”;用兩個或多個下標來區(qū)分其元素的數(shù)組,稱為“二維數(shù)組”或“多維數(shù)組”。 在C語言程式中說明一個數(shù)組後,系統(tǒng)就為它在內(nèi)存中分配一個連續(xù)的存儲區(qū),順序存放該數(shù)組的元素。這個存儲區(qū)所需要的位元組數(shù),按如下公式計算:總位元組數(shù)=數(shù)組元素個數(shù)*數(shù)據(jù)類型長度4.2一維數(shù)組4.2.1一維數(shù)組的說明 說明一個一維數(shù)組的語句格式是:<存儲類型><數(shù)據(jù)類型><數(shù)組名>[<長度>]; C語言規(guī)定,一維數(shù)組的名字不是變數(shù),而是一個記憶體地址常量(無符號數(shù)),只有它的元素才是變數(shù)。4.2.2一維數(shù)組元素的初始化

所謂一維數(shù)組的初始化,即是指在說明數(shù)組的同時為其諸元素(變數(shù))賦初值。因此,完整的數(shù)組說明語句格式為:

<存儲類型><數(shù)據(jù)類型><數(shù)組名>[<長度>]={<常量1>,<常量2>,<常量3>,…};其中<常量1>是數(shù)組第1個元素的取值,<常量2>是數(shù)組第2個元素的取值,<常量3>是數(shù)組第3個元素的取值,如此等等。關(guān)於數(shù)組元素的初始化,有4種情況需要注意。(1)如果在說明時是對數(shù)組的所有元素賦予初始值,那麼在數(shù)組說明中可以將<長度>省略(方括號不能沒有)。(2)如果在數(shù)組說明時給出了<長度>,但沒有給所有的元素賦予初始值,而只依次給前面的幾個數(shù)組元素賦了初值。那麼C語言將自動對餘下的元素賦予初值。(3)如果所說明的數(shù)組的存儲類型是static的,那麼這個數(shù)組的所有元素都是靜態(tài)(static)型變數(shù)。(4)如果數(shù)組說明時給出了<長度>,並對元素進行了初始化。那麼所列出的元素初始值的個數(shù),不能多於數(shù)組元素的個數(shù)。否則C語言就會判定為語法錯。4.2.3一維數(shù)組元素的引用 每一個數(shù)組元素是變數(shù),它們是可以接受賦值的。所以,在程式中通過向一個個數(shù)組元素賦值的方法,就能使它們獲得取值。把數(shù)組中的每個元素當成普通的變數(shù)來使用,這就是所謂的“數(shù)組元素的引用”4.3二維數(shù)組4.3.1二維數(shù)組的說明

說明一個二維數(shù)組的語句格式是:<存儲類型><數(shù)據(jù)類型><數(shù)組名>[<長度1>][<長度2>];<長度1>和<長度2>都是用方括號括住的整形常量,其數(shù)值的乘積(即<長度1>*<長度2>),表示該數(shù)組所擁有的元素個數(shù)。根據(jù)“數(shù)組名就是分配給它的存儲區(qū)起始地址”的C語言規(guī)定,對於上面說明的二維數(shù)組a,就有如下重要結(jié)論:a作為二維數(shù)組名,是一個地址常量;a[0],a[1],a[2]作為一維數(shù)組名,也都是地址常量。a是系統(tǒng)分配給這個二維數(shù)組整個存儲區(qū)的起始地址;a[0]是一維數(shù)組元素a[0][0],a[0][1],a[0][2],a[0][3]佔用的存儲區(qū)的起始地址;a[1]是一維數(shù)組元素a[1][0],a[1][1],a[1][2],a[1][3]佔用的存儲區(qū)的起始地址;a[2]是一維數(shù)組元素a[2][0],a[2][1],a[2][2],a[2][3]佔用的存儲區(qū)的起始地址。4.3.2二維數(shù)組元素的初始化 對二維數(shù)組的初始化,有如下幾種方法。 (1)分行對二維數(shù)組進行初始化。 (2)不分行將所有數(shù)據(jù)依次列在一個花括弧裏。 (3)分行對二維數(shù)組進行初始化時,可以只對部分元素賦初值。 (4)如果是對二維數(shù)組的全部元素進行初始化,那麼在數(shù)組說明語句裏,<長度1>可以省略不寫(方括號還是要的)。4.3.3二維數(shù)組元素的引用 在程式中通過向一個個數(shù)組元素賦值的方法,就能使它們獲得取值。把二維數(shù)組中的每個元素當成普通的變數(shù)來使用,這就是所謂的“二維數(shù)組元素的引用”。4.4字元數(shù)組與字串4.4.1字元數(shù)組與字串 字元數(shù)組是字元型數(shù)組的簡稱?!白衷獢?shù)組”是一個諸元素都是字元的數(shù)組。說明一個字元數(shù)組時,<數(shù)組名>前的<數(shù)據(jù)類型>應(yīng)該是char的??梢允褂脤σ话銛?shù)組元素初始化的方法,來完成對字元數(shù)組的初始化。對於字元數(shù)組,還可以直接使用字串常量,來完成對其元素的初始化工作。具體的做法有兩種。(1)用字符串常量對字元數(shù)組進行初始化。(2)用花括弧括住字串常量對字元數(shù)組進行初始化。直接用字符串常量或用花括弧括住字串常量的辦法對字元數(shù)組元素進行初始化時,所說明數(shù)組的<長度>必須比字串擁有的字元個數(shù)大1,以便能在末尾安放字串結(jié)束符“\0”。4.4.2字串的運算 在C語言的系統(tǒng)函數(shù)庫裏,提供了完成各種字串運算的函數(shù)。只要將它們所在的頭檔包含進程序,就可以直接調(diào)用它們。4.4.3常用的字串處理函數(shù)1.字串輸入函數(shù):gets() 調(diào)用的一般格式:gets(<字元數(shù)組名>);2.字串輸出函數(shù):puts() 調(diào)用的一般格式:puts(<字元數(shù)組名>);3.字串複製(拷貝)函數(shù):strcpy() 調(diào)用的一般格式:strcpy(<字元數(shù)組名1>,<字元數(shù)組名2>);4.字串連接函數(shù):strcat() 調(diào)用的一般格式:strcat(<字元數(shù)組名1>,<字元數(shù)組名2>);5.字串比較函數(shù):strcmp() 調(diào)用的一般格式:intx;x=strcmp(<字元數(shù)組名1>,<字元數(shù)組名2>);6.求字串長度函數(shù):strlen() 調(diào)用的一般格式:

intx; x=strlen(<字元數(shù)組名>);7.將字串中大寫字母改為小寫字母函數(shù):strlwr() 調(diào)用的一般格式:

strlwr(<字元數(shù)組名>);8.將字串中小寫字母改為大寫字母函數(shù):strupr() 調(diào)用的一般格式:

strupr(<字元數(shù)組名>);第5章指針本章著重講述4個方面的內(nèi)容:(1)建立地址就是指針的概念。(2)指針變數(shù)的說明和初始化。(3)指針變數(shù)的使用。(4)指針數(shù)組的含義及使用。5.1指針和指針變數(shù)5.1.1直接訪問和間接訪問 所謂一個“變數(shù)的地址”,就是指其佔用存儲區(qū)中由小到大的第1個位元組地址。 由這些可以看出下麵的兩點。 (1)地址起到了一個指向作用。(2)在C語言中說一個變數(shù)的地址,其實還隱含有這個變數(shù)的類型資訊在內(nèi),不能籠統(tǒng)地只把它視為一個地址。由於一個變數(shù)的地址(指針)也是一個值(只不過它是一個地址值,而不是普通意義的數(shù)值),因此就可以把這個地址值存放到另一個變數(shù)裏保存。這種專門用來存放變數(shù)地址的變數(shù),稱為“指針變數(shù)”。 由於一個變數(shù)的地址(指針)還隱含有這個變數(shù)的類型資訊在內(nèi),所以不能隨意把一個地址存放到任何一個指針變數(shù)中去,只能把具有相同類型的變數(shù)的地址,存放到這個指針變數(shù)裏去。可見,指針變數(shù)也應(yīng)該有自己的類型,這個類型與存放在它裏面的地址所隱含的類型應(yīng)該相同。從變數(shù)名,找到這個變數(shù)對應(yīng)的地址,從這個地址直接完成對存儲單元進行訪問的方法,稱為對內(nèi)存的“直接訪問”。通過一個地址得到另一個地址,再由得到的這個地址訪問所需的存儲單元。這種由變數(shù)的地址得到另一個變數(shù)的地址,再通過得到的這個地址,完成對存儲單元訪問的方法,稱為對內(nèi)存的“間接訪問”。5.1.2指針變數(shù)的說明和初始化 C語言把記憶體單元的地址視為一種數(shù)據(jù)類型,即指針型數(shù)據(jù)。存放指針型數(shù)據(jù)的變數(shù),稱為指針型變數(shù),簡稱指針變數(shù)。 說明一個變數(shù)是指針變數(shù)的一般格式是:<存儲類型><數(shù)據(jù)類型>*<變數(shù)名>;要注意以下3點。(1)“*”只起到一個標識的作用,它不是所說明的指針變數(shù)名本身的一個組成部分。(2)說明中的<數(shù)據(jù)類型>,是指說明的指針變數(shù)裏面所能存放的變數(shù)地址的類型。(3)相同類型的指針變數(shù)可以在一個說明語句裏出現(xiàn),但每一個變數(shù)名的前面都要冠有指針變數(shù)的標識“*”。5.1.3取地址運算符與指針運算符1.取地址運算符:& “&”是一個單目運算符,使用時的一般格式是:

&<變數(shù)名> 該運算符的運算對象只能是由<變數(shù)名>所指定的變數(shù),運算結(jié)果是得到該變數(shù)的存儲地址。2.指針運算符:* “*”是一個單目運算符,其使用的一般格式是:

*<指針變數(shù)名> 該運算符的運算對象只能是由<指針變數(shù)名>所指定的指針變數(shù)或一個地址,運算結(jié)果是訪問該指針變數(shù)(或地址)所指的變數(shù)。5.2指針與數(shù)組 可以用一個指針變數(shù)指向數(shù)組,也可以用一個指針變數(shù)指向數(shù)組的某一個元素。前者稱為“指向數(shù)組的指針變數(shù)”,簡稱“指向數(shù)組的指針”;後者稱為“指向數(shù)組元素的指針變數(shù)”,簡稱“指向數(shù)組元素的指針”。5.2.1指向一維數(shù)組的指針變數(shù) 為了讓一個指針指向一維數(shù)組,只要將這個一維數(shù)組的名字或這個一維數(shù)組第一個元素的地址賦給這個指針即可。1.用指向數(shù)組的指針來引用數(shù)組的元素 這時可以通過“++”運算符來移動指針,得到數(shù)組所有元素的地址,從而就可以訪問到數(shù)組的所有元素。 在指針p上進行++運算,並不是單純加1,而是加上它所指變數(shù)數(shù)據(jù)類型的長度單位。 在將一個指針指向一維數(shù)組首地址後,C語言提供了下麵4種直接訪問該數(shù)組第i個元素的方法:<數(shù)組名>[i] <指針變數(shù)名>[i] *(<數(shù)組名>+i) *(<指針變數(shù)名>+i) 前面兩種方法使用了數(shù)組元素的下標,所以稱為“下標法”,後面兩種方法使用了指針運算符,所以稱為“指針法”。數(shù)組名是一個地址常量,指向數(shù)組的指針是一個變數(shù),因此不能把它們完全等同地加以使用,它們之間的區(qū)別有以下3點。(1)數(shù)組名代表的是一個地址常數(shù),指針是一個變數(shù)。(2)數(shù)組名不能修改,指針可以改變指向。 (3)在數(shù)組名上只能進行加法,以計算出某個數(shù)組元素的地址,但不能對數(shù)組名進行增1、減1運算;而指針不僅可以進行加、減法,以計算出某個數(shù)組元素的地址,而且可以進行增1、減1運算,達到修改指針指向的目的。2.用指向數(shù)組元素的指針來引用數(shù)組的元素 在把數(shù)組第i個元素的地址賦給指針變數(shù)後,這個指針就指向了該數(shù)組的第i個元素了。這時可以通過++和--運算符來向前、向後一步步地移動指針,得到數(shù)組所有元素的地址,從而訪問到數(shù)組的所有元素;也可以通過減k或加k的辦法(k是一個正整數(shù)),得到以第i個元素為基準的前第k個元素的地址,或得到以第i個元素為基準的後第k個元素的地址,從而訪問到所要訪問的數(shù)組元素。5.2.2指向字串的指針變數(shù) C語言還提供了基於指針變數(shù)來實現(xiàn)字串的方法。由於指針變數(shù)是一個變數(shù),它能夠接受賦值。當把一個地址賦給它時,指針的指向也就隨之改變。因此,利用字元型指針變數(shù)來處理字串,在程式中使用起來會感到便利和簡捷。讓一個字元指針變數(shù)指向字串常量的方法有兩種。 (1)在指針變數(shù)初始化時。格式是:char*<指針變數(shù)名>=<字串常量>; (2)在程式中,直接將字串常量賦給一個字元型指針變數(shù)。格式是:char*<指針變數(shù)名>;<指針變數(shù)名>=<字串常量>; 無論採用哪種方法,都只是把字串常量在內(nèi)存的首地址賦給了指針,而不是把這個字串賦給了指針。指針只能接受地址。5.2.3指向二維數(shù)組的指針變數(shù)1.讓指針變數(shù)指向一個二維數(shù)組首地址 在讓一個指針指向二維數(shù)組的首地址後,就可以通過這個指針訪問數(shù)組的各個元素了。有兩種方法可以採用。方法1:由於C語言在內(nèi)存裏是以二維數(shù)組行的順序來存放元素的,因此可以把指向二維數(shù)組的指針視為指向一個“大”的一維數(shù)組的指針,利用它從頭到尾訪問數(shù)組的所有元素。方法2:根據(jù)二維數(shù)組元素的兩個下標值,計算出該元素的地址,然後使用指針運算符“*”作用在這個地址上,達到訪問該元素的目的。2.讓指針變數(shù)指向二維數(shù)組的某個元素 要讓一個指針變數(shù)指向二維數(shù)組的某個元素,可以在變數(shù)說明時對它進行初始化,也可以在程式中使用賦值語句。5.3指針數(shù)組把若干個指針變數(shù)統(tǒng)一起一個名字,相互間用下標(一個或兩個)來區(qū)分,就構(gòu)成了一個所謂的“指針型數(shù)組”,簡稱“指針數(shù)組”。指針數(shù)組中的每個元素,都是一個指針變數(shù),在裏面存放的都是一個記憶體單元的地址值,即存放的是一個個指針。5.3.1一維指針數(shù)組的說明和初始化 一維指針數(shù)組說明的一般格式為:<存儲類型><數(shù)據(jù)類型>*<數(shù)組名>[<長度>]; 對指針數(shù)組做完整說明的一般格式是:<存儲類型><數(shù)據(jù)類型>*<數(shù)組名>[<長度>]={<地址1>,<地址2>,…};5.3.2指針數(shù)組元素的引用 指針數(shù)組元素,既是一個數(shù)組元素,又是一個指針。因此引用起來,既要注意到它的數(shù)組元素特徵,也要注意到它的指針特徵。第6章函數(shù)本章著重講述4個方面的內(nèi)容:(1)定義函數(shù)的方法。(2)編寫程式時,調(diào)用函數(shù)和被調(diào)函數(shù)的位置關(guān)係。(3)調(diào)用函數(shù)和被調(diào)函數(shù)間數(shù)據(jù)傳遞的各種方式。(4)程式中各個變數(shù)的作用域和生命期。6.1函數(shù)的概念所謂“函數(shù)”,是程式中可以反復(fù)使用的一個程式段,其他函數(shù)可以通過調(diào)用語句來執(zhí)行這段程式,完成所需要的工作。C語言本身為用戶提供了很多函數(shù),這稱為“系統(tǒng)函數(shù)”。程式設(shè)計者自己編寫的函數(shù),稱為“用戶函數(shù)”。6.1.1函數(shù)的定義函數(shù)定義的一般格式是:<函數(shù)類型><函數(shù)名>(<形式參數(shù)表>){<函數(shù)體>}其中:(1)<函數(shù)類型>:是所定義函數(shù)在執(zhí)行完後返回結(jié)果的數(shù)據(jù)類型,即返回值的類型。(2)<函數(shù)名>:是所定義函數(shù)的名稱,它可以是C語言中任何合法的識別字。(3)<形式參數(shù)表>:形式參數(shù)表中列出的形式參數(shù),簡稱“形參”。被調(diào)函數(shù)就是通過這些形參,接收從調(diào)用函數(shù)傳遞過來的數(shù)據(jù)。定義的函數(shù)可以有參數(shù),也可以沒有參數(shù)。如果定義的函數(shù)有形參,則稱為“有參函數(shù)”,否則就是“無參函數(shù)”。(4)<函數(shù)體>:函數(shù)體由一對花括弧“{}”括起,它由變數(shù)說明語句和執(zhí)行語句序列組成。6.1.2函數(shù)的調(diào)用 根據(jù)一個函數(shù)是否有返回值,C語言將以不同的方式對它們進行調(diào)用。 (1)沒有返回值的函數(shù),是以函數(shù)調(diào)用語句的方式進行調(diào)用的。即:<函數(shù)名>(<實際參數(shù)表>); (2)有返回值的函數(shù),是以函數(shù)運算式的方式調(diào)用的。即:<函數(shù)名>(<實際參數(shù)表>) 這兩種調(diào)用方式根本的不同是:前者是一個語句,以分號結(jié)尾;後者是一個運算式,凡是一般運算式能夠出現(xiàn)的地方,它都可以出現(xiàn)。 函數(shù)調(diào)用時給出的<實際參數(shù)表>中,必須列出與被調(diào)函數(shù)定義中所給形參個數(shù)相等、類型相符、次序相同的實參,各實參之間仍以逗號為分隔符號。否則就會出現(xiàn)語法錯誤。6.1.3函數(shù)的原型說明 在函數(shù)中調(diào)用一個用戶函數(shù)時,必須首先保證這個被調(diào)用的用戶函數(shù)已經(jīng)存在。如果放的位置顛倒了,若被調(diào)函數(shù)返回值的類型是int、char,那麼不會產(chǎn)生什麼影響;若被調(diào)函數(shù)返回值的類型是非int、非char,即返回值的類型是float、double或void等,那麼編譯時就會給出出錯資訊。 C語言提供了兩種解決這個問題的辦法,一是把被調(diào)用者與調(diào)用者的位置重新放正確;二是保持這種顛倒的位置關(guān)係,但在整個程式最前面或在調(diào)用函數(shù)裏先對被調(diào)函數(shù)做一個說明,這就是所謂的“函數(shù)原型說明”。 函數(shù)原型說明的一般格式是:<函數(shù)類型><函數(shù)名>(<形參類型表>); 它類同於函數(shù)定義中的函數(shù)頭,但有兩點區(qū)別:一是函數(shù)定義中函數(shù)頭裏給出的是形式參數(shù)表,它由“<類型><參數(shù)>”對組成,函數(shù)原型說明裏給出的是形參類型表,它只列出“<類型>”;二是函數(shù)原型說明要以分號為結(jié)尾,成為一條說明語句。6.1.4變數(shù)的作用域和生命期1.全局變數(shù)、局部變數(shù)與變數(shù)的作用域 編寫程式時,C語言允許在3個地方說明變數(shù)。 (1)在所有函數(shù)之外。這種變數(shù)稱為“全局變數(shù)”,它可以被該程式中的所有函數(shù)使用。(2)在某個函數(shù)(或複合語句)裏面。這種變數(shù)稱為“局部變數(shù)”,它只能在說明它的範圍內(nèi)使用。(3)作為函數(shù)的形參。這類變數(shù)也是局部變數(shù),其作用就是用於接收調(diào)用者傳遞過來的實參數(shù)據(jù),出了函數(shù),該變數(shù)就不能使用了。 在C語言中,稱一個變數(shù)的作用範圍為“變數(shù)的作用域”。由於每個變數(shù)都有自己的作用域,因此在不同函數(shù)內(nèi)說明的局部變數(shù)就可以使用相同的變數(shù)名,類型也可以不一樣。它們不會因為名字相同而互相干擾。C語言規(guī)定,在一個根源程式檔中,當所說明的全局變數(shù)與某個函數(shù)內(nèi)說明的局部變數(shù)同名時,那麼在該局部變數(shù)的作用域,全局變數(shù)就不起作用。2.自動變數(shù)、靜態(tài)變數(shù)與變數(shù)的生命期 (1)在函數(shù)內(nèi)說明一個變數(shù)(它當然是一個局部變數(shù))時,若將其存儲類型說成是auto,或沒有給出它的存儲類型,那麼這個變數(shù)是自動型的。這時,只有在調(diào)用函數(shù)而遇到這種變數(shù)時,C語言才在動態(tài)存儲區(qū)裏為它們分配所需要的存儲區(qū),函數(shù)調(diào)用完畢,就立即收回它們佔用的存儲區(qū)。從這樣的處理過程可以看出,每次調(diào)用函數(shù),都必須重新為自動型變數(shù)分配存儲區(qū),重新進行初始化。(2)在函數(shù)內(nèi)說明一個變數(shù)(它當然是一個局部變數(shù))時,若將其存儲類型說成是static,那麼這個變數(shù)是靜態(tài)型的。對於靜態(tài)變數(shù),C語言是編譯時在靜態(tài)存儲區(qū)裏為它們分配所需要的存儲區(qū),即使函數(shù)調(diào)用完畢,也不收回分配給它的存儲區(qū),直至程式運行結(jié)束。如果程式中說明靜態(tài)變數(shù)時對它做了初始化,那麼這種初始化只做一次,下次再調(diào)用就只是沿用上次調(diào)用後的取值,不再初始化了。 在C語言中,稱一個變數(shù)說明後它存在的時間區(qū)間為“變數(shù)的生命期”。對於自動變數(shù),它只在其作用域裏存在,出了作用域就不存在了。因此自動變數(shù)的生命期就是它的作用域;對於靜態(tài)變數(shù),在它的作用域裏存在,出了作用域它仍然存在(只是不能使用)。因此靜態(tài)變數(shù)的生命期比它的作用域來得大。6.2函數(shù)調(diào)用中的數(shù)據(jù)傳遞6.2.1參數(shù)是普通變數(shù)時的數(shù)據(jù)傳遞過程當調(diào)用者與被調(diào)用者之間是以普通變數(shù)作為參數(shù)進行數(shù)據(jù)傳遞時,調(diào)用者是把實參變數(shù)的值賦給被調(diào)用者的形參變數(shù)的。由於實參變數(shù)和形參變數(shù)佔用的是記憶體中不同的存儲區(qū),被調(diào)函數(shù)對形參的加工,是在形參變數(shù)自己的存儲區(qū)裏進行,所以根本不會影響到實參變數(shù)。稱這種數(shù)據(jù)傳遞是“單向的”。6.2.2參數(shù)是指針變數(shù)時的數(shù)據(jù)傳遞過程 當調(diào)用者與被調(diào)用者之間是以指針變數(shù)作為參數(shù)進行數(shù)據(jù)傳遞時,調(diào)用者是把實參指針變數(shù)的值賦給被調(diào)用者的形參指針變數(shù)的。於是,實參指針變數(shù)和形參指針變數(shù)雖然在內(nèi)存中位於不同的存儲區(qū),但它們的內(nèi)容卻都是同一個地址,即它們是指向記憶體中同一個存儲區(qū)的兩個不同的指針。 於是,被調(diào)函數(shù)中對形參所指變數(shù)的任何處理,也就是在對實參所指變數(shù)做相同的處理。因此,從被調(diào)函數(shù)返回調(diào)用者時,處理結(jié)果就在實參指針所指變數(shù)裏面保存著。調(diào)用者和被調(diào)用者,通過共同指向的存儲區(qū),“雙向的”傳遞了資訊:調(diào)用者通過這個存儲區(qū),把要加工的資訊傳遞給被調(diào)用者;被調(diào)用者又通過這個存儲區(qū),將加工完的結(jié)果資訊傳遞給調(diào)用者。6.2.3參數(shù)是數(shù)組名時的數(shù)據(jù)傳遞過程1.以長度固定的數(shù)組作為函數(shù)參數(shù)2.以非固定長度數(shù)組作為函數(shù)參數(shù) 當以數(shù)組為參數(shù)在函數(shù)間傳遞數(shù)據(jù)時,實參與形參共用同一個存儲區(qū)。 由於數(shù)組名是一個地址(指針),所以在調(diào)用者將實參數(shù)組名傳遞給被調(diào)函數(shù)時,與它對應(yīng)的形參也可以是一個指針變數(shù)。6.2.4返回語句return 返回語句return都出現(xiàn)在被調(diào)函數(shù)中,它的作用是返回調(diào)用者,並向調(diào)用者傳遞計算結(jié)果。該語句有兩種使用格式:

格式1:return; 格式2:return(<運算式>); 第1種格式用於無返回值的被調(diào)函數(shù)。它不返回任何值,只是起一個返回調(diào)用者的作用。第2種格式一方面返回調(diào)用者,同時把圓括號裏<運算式>的值傳遞給調(diào)用者。6.3指針型函數(shù)如果一個函數(shù)的返回值是一個指針(地址),那麼就說這個函數(shù)是返回指針的函數(shù),即“指針型函數(shù)”。指針型函數(shù)屬於有返回值函數(shù),且返回的是一個地址值。因此調(diào)用這種函數(shù)時,在調(diào)用者裏接受返回值的必須是指針變數(shù),或是指針數(shù)組元素等,而不能是其他。6.3.1指針型函數(shù)的定義方法 指針型函數(shù)的定義格式和一般函數(shù)的定義格式基本相同,只是要在所定義函數(shù)名的前面冠以一個“*”。即:<函數(shù)類型>*<函數(shù)名>(<形式參數(shù)表>){<函數(shù)體>}6.3.2指針型函數(shù)的使用 指針型函數(shù)的用法,與其它函數(shù)一樣,沒有什麼特殊的地方。只是應(yīng)該注意兩點: (1)定義中出現(xiàn)的“*”,只表明這是一個返回指針的函數(shù),並不是函數(shù)名的一部分。 (2)對指針型函數(shù)進行調(diào)用之後,要把它的返回值賦給相同指針類型的變數(shù)。第7章用戶自定義的數(shù)據(jù)類型本章著重講述6個方面的內(nèi)容:(1)結(jié)構(gòu)式數(shù)據(jù)類型的定義、變數(shù)說明和使用。(2)指向結(jié)構(gòu)式數(shù)據(jù)類型的指針。(3)鏈表及其操作。(4)共用式數(shù)據(jù)類型的定義、變數(shù)說明和使用。(5)枚舉式數(shù)據(jù)類型的定義、變數(shù)說明和使用。(6)編譯預(yù)處理和起別名。7.1結(jié)構(gòu)式數(shù)據(jù)類型 C語言向用戶提供了把不同數(shù)據(jù)類型聚集在一起、構(gòu)成一種新數(shù)據(jù)類型的手段——“結(jié)構(gòu)”。用戶可以根據(jù)實際問題的需要,利用結(jié)構(gòu)來決定所定義的新數(shù)據(jù)類型叫什麼名字,由哪些成員組成。用結(jié)構(gòu)定義了一種結(jié)構(gòu)式的數(shù)據(jù)類型後,再說明具有這種結(jié)構(gòu)式數(shù)據(jù)類型的變數(shù),就可以在程式中使用它們了。7.1.1結(jié)構(gòu)式數(shù)據(jù)類型的定義 定義結(jié)構(gòu)類型的一般格式是:

struct<結(jié)構(gòu)類型名> { <成員列表> };struct<結(jié)構(gòu)類型名> 這個整體,就是新定義的一種數(shù)據(jù)類型的名字了。 <成員列表>由如下形式的“對”組成:<數(shù)據(jù)類型><成員名>; 每一對給出該結(jié)構(gòu)式類型中一個成員的數(shù)據(jù)類型和名稱。7.1.2結(jié)構(gòu)類型變數(shù)的說明與初始化 定義了一個結(jié)構(gòu)類型,只表明這種數(shù)據(jù)類型的存在,它不是變數(shù),並不佔用記憶體空間(這猶如int並不是變數(shù),並不佔用記憶體空間是相同的道理)。只有說明了一個變數(shù)具有這種數(shù)據(jù)類型,系統(tǒng)才為其分配存儲空間,程式中才能使用這個變數(shù)。 說明一個結(jié)構(gòu)類型的變數(shù)(在不引起混淆的情況下,簡稱結(jié)構(gòu)變數(shù),甚至就稱變數(shù)),有如下兩種方式。1.先定義結(jié)構(gòu)類型,再說明變數(shù)2.在定義結(jié)構(gòu)類型的同時說明變數(shù)7.1.3結(jié)構(gòu)變數(shù)成員的引用 對結(jié)構(gòu)變數(shù)的使用,其含義是指對它各個成員的引用。引用結(jié)構(gòu)變數(shù)成員的一般方式是:<結(jié)構(gòu)變數(shù)名>.<成員名>其中“.”是成員運算符。從輸出的結(jié)果可以看出如下幾點。(1)C語言是按照結(jié)構(gòu)類型定義中成員的順序來分配存儲空間的。(2)結(jié)構(gòu)變數(shù)中的成員,可以像通常的同類型變數(shù)那樣進行各種運算和操作。(3)對結(jié)構(gòu)變數(shù)成員的引用,不同於通常變數(shù)的引用方式,不能直接使用成員名。而是採取“由整體到局部”的層次式,即先指明是哪個結(jié)構(gòu)變數(shù),然後通過成員運算符“.”,指定所要成員。7.1.4結(jié)構(gòu)數(shù)組的說明與初始化 由相同結(jié)構(gòu)變數(shù)為元素的數(shù)組,就是“結(jié)構(gòu)數(shù)組”。也就是說,結(jié)構(gòu)數(shù)組中的每一個元素,都是一個相同結(jié)構(gòu)類型的變數(shù)。因此,結(jié)構(gòu)數(shù)組既具有結(jié)構(gòu)的特點,也具有數(shù)組的特點。即:(1)要先定義結(jié)構(gòu)類型,再說明結(jié)構(gòu)數(shù)組;或在定義結(jié)構(gòu)類型的同時說明結(jié)構(gòu)數(shù)組。(2)結(jié)構(gòu)數(shù)組元素由下標區(qū)分,它們都是結(jié)構(gòu)變數(shù)。(3)結(jié)構(gòu)數(shù)組元素通過成員運算符引用其每一個結(jié)構(gòu)成員。 在說明了一個結(jié)構(gòu)數(shù)組後,系統(tǒng)就會在內(nèi)存中為其開闢一個連續(xù)的存儲區(qū)存放它的元素,結(jié)構(gòu)數(shù)組名就是這個存儲區(qū)的起始地址。結(jié)構(gòu)數(shù)組在內(nèi)存的存放,仍然按照元素的順序排列,每一個元素佔用的存儲位元組數(shù),就是這種結(jié)構(gòu)類型所需要的位元組數(shù)。這些與對一般數(shù)組的處理是完全相同的。7.2指向結(jié)構(gòu)類型的指針 說明一個已有定義的結(jié)構(gòu)類型指針後,把一個同類型的變數(shù)地址賦給它,該指針就指向了這個變數(shù),這個指針就是指向結(jié)構(gòu)類型變數(shù)的指針;把一個同類型的數(shù)組名賦給它,該指針就指向了這個數(shù)組,這個指針就是指向結(jié)構(gòu)類型數(shù)組的指針。7.2.1指向結(jié)構(gòu)類型變數(shù)的指針 說明一個結(jié)構(gòu)類型的變數(shù)後,它就在內(nèi)存獲得了存儲區(qū)。該存儲區(qū)的起始地址,就是這個變數(shù)的地址(指針)。如果說明一個這種結(jié)構(gòu)類型的指針變數(shù),把結(jié)構(gòu)類型變數(shù)的地址賦給它,這個指針就指向這個變數(shù)了。 在C語言裏,還有一種借助於指針變數(shù)來訪問結(jié)構(gòu)變數(shù)成員的方法,即用指向成員運算符“->”。一般格式是:指針變數(shù)名->結(jié)構(gòu)成員名 這樣一來,訪問結(jié)構(gòu)變數(shù)成員就有了3種等價的形式。(1)直接利用結(jié)構(gòu)變數(shù)名,一般格式是:

結(jié)構(gòu)變數(shù)名.成員名(2)利用指向結(jié)構(gòu)變數(shù)的指針和指針運算符“*”,一般格式是:

(*指針變數(shù)名).成員名(3)利用指向結(jié)構(gòu)變數(shù)的指針和指向成員運算符“->”,一般格式是:

指針變數(shù)名->成員名7.2.2指向結(jié)構(gòu)類型數(shù)組的指針 如果說明了一個結(jié)構(gòu)數(shù)組和一個同類型的指針變數(shù)後,把數(shù)組名賦給該指針變數(shù),那麼這個指針變數(shù)就指向了這個數(shù)組。這時,程式中不僅可以使用下標形式來訪問數(shù)組的元素,也可以通過對指針變數(shù)的操作,對數(shù)組元素進行訪問。7.2.3C語言的記憶體管理函數(shù) 需要時就向系統(tǒng)申請一定數(shù)量的存儲區(qū);不需要時,就把佔用的存儲區(qū)歸還給系統(tǒng)?利用C語言提供的記憶體管理函數(shù),就可以達到這種目的。常用的記憶體管理函數(shù)有兩個,它們被包含在頭檔“alloc.h”(或頭檔“stdlib.h”)裏。1.長度運算符:sizeof 一般格式是:sizeof(<數(shù)據(jù)類型符>) 或 sizeof(<變數(shù)名>)2.void指針類型 所謂“void指針類型”,即它是一個指針變數(shù),在它裏面存放的是一個記憶體地址,但沒有指明它是指向哪一種數(shù)據(jù)類型。3.記憶體分配函數(shù)malloc() malloc()函數(shù)的函數(shù)頭:void*malloc(unsignedintsize) 即malloc()函數(shù)有一個無符號整型的形式參數(shù),返回值是void型指針(地址)。 malloc()函數(shù)的功能: 向系統(tǒng)申請大小為size個位元組的存儲區(qū)。如果申請成功,則返回分配到存儲區(qū)的第1個位元組地址(viod型);如果申請失敗,則返回NULL(這是系統(tǒng)定義的一個符號常量,表示空指針)。 調(diào)用malloc()函數(shù)的一般格式:<指針變數(shù)名>=(<強制轉(zhuǎn)換類型>)malloc(<所需位元組數(shù)>);4.記憶體釋放函數(shù)free() free()函數(shù)的函數(shù)頭:voidfree(void*p) 即free()函數(shù)以一個void型指針作為形式參數(shù),無返回值。 free()函數(shù)的功能: 將事先經(jīng)由malloc()函數(shù)申請到的存儲區(qū)歸還給系統(tǒng),指針p指向要釋放的這個存儲區(qū)。如果p的值是NULL,則free()函數(shù)什麼事情也不做。 調(diào)用free()函數(shù)的一般格式:free(<指針變數(shù)名>);7.2.4自引用結(jié)構(gòu)類型和鏈表 “鏈表”類同於結(jié)構(gòu)數(shù)組,其元素也都具有相同的結(jié)構(gòu)類型,每個元素也都佔用同樣大小的存儲區(qū)。但由於它的元素個數(shù)是不固定的(可以隨時增加或減少),所以只能是在需要時為某個元素分配存儲區(qū),不用時就收回存儲區(qū)。 要注意,C語言規(guī)定在結(jié)構(gòu)類型定義中,不能包含有本類型的成員。但唯一的例外是在一個結(jié)構(gòu)類型定義中,可以有指向該結(jié)構(gòu)類型的指針作為成員,因為指針所需要的存儲量是固定的。由於這個指針指向的是具有這種結(jié)構(gòu)的變數(shù),所以常稱其是一個“自引用”結(jié)構(gòu)。 圖7-10給出了鏈表的直觀示例。圖7-10一個鏈表的直觀示例7.3共用式數(shù)據(jù)類型 與結(jié)構(gòu)式數(shù)據(jù)類型類似,“共用”式數(shù)據(jù)類型也是C語言向用戶提供的一種把不同數(shù)據(jù)類型聚集在一起,構(gòu)成一種新數(shù)據(jù)類型的手段。它們兩者間最大的區(qū)別是:結(jié)構(gòu)類型變數(shù)的每一個成員都佔有各自的存儲區(qū),而共用類型變數(shù)的所有成員卻共用一個存儲區(qū)。7.3.1共用式數(shù)據(jù)類型的定義 在程式中定義一個共用式數(shù)據(jù)類型,要用到C語言裏的保留字“union”。定義共用類型的一般格式是:

union<共用類型名> { <成員列表> }; 經(jīng)過定義後,在C語言裏:union<共用類型名> 這個整體,就是新定義的一種數(shù)據(jù)類型的名字了。 <成員列表>由如下形式的“對”組成:<數(shù)據(jù)類型><成員名>;7.3.2共用類型變數(shù)的說明和使用 定義了一個共用類型後,只表明這種數(shù)據(jù)類型的存在,它不是變數(shù),並不佔用記憶體空間。只有說明了一個變數(shù)具有這種數(shù)據(jù)類型,系統(tǒng)才會為這個變數(shù)分配存儲空間,程式中才能使用這個變數(shù)。 說明一個共用類型的變數(shù)(在不引起混淆的情況下,簡稱共用變數(shù),甚至就稱變數(shù)),有如下的兩種方式。1.先定義共用類型,再說明變數(shù) 對於共用變數(shù),C語言是以其所有成員中所需存儲量最大者來為這個變數(shù)分配存儲空間的,共用變數(shù)的各個成員都使用這個存儲空間,只是不同時使用罷了。2.在定義共用類型的同時說明變數(shù) 下麵3種訪問共用型變數(shù)成員的方法是等價的。

共用變數(shù)名.成員名 (*p).成員名 p->成員名 由於共用變數(shù)的若干個成員共同使用一個存儲區(qū)域,而這些成員的類型可以完全不同,因此共用變數(shù)在某一時刻起作用的成員,是指最後一次被賦值的成員。7.4枚舉式數(shù)據(jù)類型 C語言向用戶提供了枚舉式數(shù)據(jù)類型。枚舉式數(shù)據(jù)類型同樣是一種定義新數(shù)據(jù)類型的手段,其特點是用若干名字代表一個整型常量的集合,具有這種類型的變數(shù),只能以集合中所列名字為其取值。7.4.1枚舉式數(shù)據(jù)類型的定義 定義枚舉類型的一般格式是:

enum<枚舉類型名> { <枚舉元素表> }; 經(jīng)過定義後,在C語言裏:union<枚舉類型名> 這個整體,就是新定義的一種數(shù)據(jù)類型的名字了。 <枚舉元素表>列出由逗號隔開的n個識別字,它們是具有這種數(shù)據(jù)類型的變數(shù)可取整型數(shù)值相對應(yīng)的符號名字。要特別注意,枚舉定義中<枚舉元素表>裏列出的名字,是整型數(shù)值相對應(yīng)的符號名字,不是字串常量。 在定義時,可以更改<枚舉元素表>中所列識別字對應(yīng)的整型數(shù)值。7.4.2枚舉類型的使用1.先定義枚舉類型,再說明變數(shù)2.在定義枚舉類型的同時說明變數(shù)7.5編譯預(yù)處理和起別名7.5.1巨集命令#define C語言中,以“#define”開頭的行稱為“巨集命令行”。1.簡單宏 簡單巨集命令行的一般形式是:#define<宏名><字元序列> 其中<宏名>是一個符合C語言語法規(guī)定的識別字,為了與程式中的變數(shù)加以區(qū)分,宏名常用大寫字母書寫。<字元序列>是由C語言字元集中字元構(gòu)成的序列,它不是字串常量,因此外面沒有雙引號。 簡單巨集命令行的作用是:有了它以後,編程時可以把出現(xiàn)在程式中的<字元序列>都使用<宏名>來代替。而在編譯預(yù)處理時,又反過來做宏替換——把程式中的<宏名>全部用<字元序列>替換回來。 如果要取消一個已有宏的作用,就要在程式的適當?shù)胤桨才啪幾g預(yù)處理命令:#undef<宏名>這樣,由<宏名>所指定的宏的作用就終止了。使用巨集命令行要注意以下幾點。(1)在寫巨集命令行時,#define、<宏名>、<字元序列>之間要用空格隔開。(2)每一個巨集命令行要單獨佔用一行,它不能以分號“;”作為結(jié)束。(3)在編譯預(yù)處理做宏替換時,只是用<字元序列>“原封不動地”將程式中的<宏名>替換掉。2.帶參數(shù)宏 帶參數(shù)巨集命令行的一般形式是:#define<宏名>(<參數(shù)表>)<字元序列> 帶參數(shù)巨集命令行的作用是:有了它以後,編程時出現(xiàn)在程式中的<字元序列>不僅可以用<宏名>來代替,而且宏名中可以帶有參數(shù)。而在編譯預(yù)處理時,又反過來做宏替換——把程式中的<宏名>及其參數(shù)全部用相應(yīng)的<字元序列>替換回來。使用帶參數(shù)巨集命令行要注意以下兩點。(1)帶參數(shù)巨集命令行裏給出的是形式參數(shù),程式中使用的是實際參數(shù)。(2)帶參數(shù)宏與簡單宏在替換規(guī)則上是一樣的,編譯預(yù)處理時都是“原封不動地”替換。帶參數(shù)宏看起來與有參函數(shù)類似,也有形參、實參之說。但它們之間有如下幾點區(qū)別。(1)函數(shù)調(diào)用時,先計算實際參數(shù)的值,然後向形式參數(shù)傳遞;宏替換時,不對它的參數(shù)進行任何計算,只是簡單地替換而已。(2)函數(shù)名是有類型的,函數(shù)中的形式參數(shù)和實際參數(shù)也都有自己明確的類型;宏名沒有類型,其參數(shù)也無類型可言,它們都只是符號而已。(3)函數(shù)調(diào)用是在程式運行時處理的(比如為參數(shù)分配存儲區(qū));宏替換是在編譯前預(yù)處理時完成的,沒有分配存儲區(qū)的問題。(4)函數(shù)調(diào)用不會增加程式的長度,但要耗費程式的運行時間;宏替換會增加程式的長度,耗費的是編譯時間,而不是程式的運行時間。7.5.2檔包含命令#include 檔包含命令行的一般形式是:

#include<檔案名>

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論