計算機軟件基礎(chǔ)-05_第1頁
計算機軟件基礎(chǔ)-05_第2頁
計算機軟件基礎(chǔ)-05_第3頁
計算機軟件基礎(chǔ)-05_第4頁
計算機軟件基礎(chǔ)-05_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機軟件計算機軟件技術(shù)基礎(chǔ)技術(shù)基礎(chǔ)(5 5)3 3 模塊化程序設(shè)計模塊化程序設(shè)計本章主要內(nèi)容本章主要內(nèi)容1. 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用2. 作用域和存儲類別作用域和存儲類別 3. 編譯預(yù)處理編譯預(yù)處理4. 系統(tǒng)函數(shù)系統(tǒng)函數(shù)5. 應(yīng)用程序舉例應(yīng)用程序舉例3.1 3.1 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n函數(shù)的定義函數(shù)的定義n函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用n函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞n函數(shù)的返回方式函數(shù)的返回方式n嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用3.1.1 3.1.1 函數(shù)的定義函數(shù)的定義1) C的函數(shù)的函數(shù) C程序是由函數(shù)構(gòu)成的,從用戶的角度看,C的函數(shù)

2、有兩類:系統(tǒng)函數(shù)和用戶定義函數(shù)。 (1)系統(tǒng)函數(shù))系統(tǒng)函數(shù) 系統(tǒng)函數(shù)又叫做標(biāo)準(zhǔn)函數(shù)或庫函數(shù),由C語言系統(tǒng)提供,它們通常分為四類:數(shù)學(xué)函數(shù)、字符和字符串處理函數(shù)、輸入輸出函數(shù)、動態(tài)存儲分配函數(shù)。 (2)用戶定義函數(shù))用戶定義函數(shù) 用戶定義函數(shù)是構(gòu)成C程序的基礎(chǔ),程序設(shè)計中的模塊設(shè)計通常就是指用戶定義函數(shù)的設(shè)計,它包括主函數(shù)和其它非標(biāo)準(zhǔn)函數(shù)。定義一個用戶函數(shù),也就是設(shè)計一個模塊,可以用兩種定義格式: (1)傳統(tǒng)定義格式: (2)現(xiàn)代定義格式: 類型類型 函數(shù)名函數(shù)名(形參表形參表) 類型類型 函數(shù)名函數(shù)名(形參表及其說明形參表及其說明) 形參說明形參說明 函數(shù)體函數(shù)體 函數(shù)體函數(shù)體 例如: lon

3、g fac(x) int x long y; for(y=1;x0;-x) y* = x; return(y); long fac(int x) long y; for(y=1;x0;-x) y* = x; return(y); 2) 函數(shù)的定義形式函數(shù)的定義形式 由于形參是函數(shù)用于接受數(shù)據(jù)的,必然涉及數(shù)據(jù)類型的問題,因此,在使用時必須對其類型加以說明。 (1)形參的形式 與變量相同,也有相應(yīng)的存儲單元, 因此每一個形參也可稱為形參變量。 (2)形參的性質(zhì) 只是一種形式參數(shù),負(fù)責(zé)把外部數(shù)據(jù)接收到函數(shù)中來,并可參與函數(shù)內(nèi)部的運算,但它只在所定義的函數(shù)內(nèi)有效。 (3)形參的類型 與變量一樣在使用前

4、必須根據(jù)需要指定一種類型,指定的方式有兩種。 (4)函數(shù)可以沒有形參,但必須保留一對括號。3) 函數(shù)形參的說明函數(shù)形參的說明3.1 3.1 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n函數(shù)的定義函數(shù)的定義n函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用n函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞n函數(shù)的返回方式函數(shù)的返回方式n嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用1) 函數(shù)的說明函數(shù)的說明 C的任何函數(shù)在被使用之前都要進行說明,以通知系統(tǒng),函數(shù)使用后返回的值屬于何種類型、函數(shù)有什么樣的形參。 (1)系統(tǒng)函數(shù)的說明)系統(tǒng)函數(shù)的說明 系統(tǒng)函數(shù)的說明都由系統(tǒng)定義在相應(yīng)的“頭文件”中,使用時只需在程序的適當(dāng)位置用#i

5、nclude加以說明即可。如:#include 或 #include “stdio.h”3.1.2 3.1.2 函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用(2)用戶定義函數(shù)的說明)用戶定義函數(shù)的說明 函數(shù)的說明應(yīng)在函數(shù)被調(diào)用之前進行,一般是在調(diào)用它的函數(shù)(主調(diào)程序)中說明。 被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前時,可以不必說明。 被調(diào)函數(shù)的返回值是int或char時,可以不必說明。 說明形式:類型類型 函數(shù)名(形參及說明);函數(shù)名(形參及說明);P97 例例3.2 找出11000之間的全部素數(shù)。1) 函數(shù)的說明函數(shù)的說明#include void main() int k; int prime(int n); /

6、對函數(shù)的說明對函數(shù)的說明 for(k=1;k=1000;k+) if(prime(k) printf(%5d,k); printf(n); int prime(int n) int i; for(i=2;in/2;i+) if(n%i=0) return 0; return 1; 如果將被調(diào)函數(shù)放在主調(diào)函數(shù)之前,則可以不用說明。例如: 在程序執(zhí)行過程中,一個函數(shù)調(diào)用另一個函數(shù)以完成某一特定的功能稱為函數(shù)調(diào)用。前者叫主調(diào)函數(shù),后者稱為被調(diào)函數(shù)。 函數(shù)的調(diào)用可以是表達式中的一部分,如: y=3.5+sin(x); 也可單獨為一條表達式語句,如:printf(“%d, %f n” , n, x);

7、函數(shù)調(diào)用的一般形式為:函數(shù)名(實參表)函數(shù)名(實參表)其中,函數(shù)名 指定調(diào)用對象(被調(diào)函數(shù)); 實參表 列出傳遞數(shù)據(jù),可以是常量、變量和表達式,它們必須與被調(diào)函數(shù)的形參在位置、個數(shù)和類型上一一對應(yīng)。2) 函數(shù)的調(diào)用函數(shù)的調(diào)用函數(shù)調(diào)用的執(zhí)行過程為:函數(shù)調(diào)用的執(zhí)行過程為: (1)參數(shù)傳遞。如果函數(shù)有參數(shù),則主調(diào)函數(shù)將實參值傳遞給被調(diào)函數(shù)對應(yīng)的形參。 (2)程序執(zhí)行控制權(quán)由主調(diào)函數(shù)轉(zhuǎn)到被調(diào)函數(shù)。執(zhí)行被調(diào)函數(shù)的函數(shù)體。 (3)執(zhí)行到被調(diào)函數(shù)中的return語句或函數(shù)體的最后一個“”時,將程序執(zhí)行控制權(quán)和被調(diào)函數(shù)的執(zhí)行結(jié)果返回給主調(diào)函數(shù)。如果被調(diào)函數(shù)沒有返回值,則只交回控制權(quán)。 (4)函數(shù)的返回值由re

8、turn語句實現(xiàn),return中表達式的類型應(yīng)與函數(shù)定義的類型一致。一個被調(diào)函數(shù)原則上可以返回一個值或沒有返回值,如果函數(shù)沒有返回值,函數(shù)定義時用void說明。主調(diào)函數(shù)主調(diào)函數(shù)函數(shù)調(diào)用函數(shù)調(diào)用執(zhí)行結(jié)束執(zhí)行結(jié)束被調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)結(jié)束被調(diào)函數(shù)結(jié)束傳遞參數(shù),交出控制權(quán)傳遞參數(shù),交出控制權(quán)返回函數(shù)值,交回控制權(quán)返回函數(shù)值,交回控制權(quán)3.1 3.1 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n函數(shù)的定義函數(shù)的定義n函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用n函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞n函數(shù)的返回方式函數(shù)的返回方式n嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用 在有參數(shù)函數(shù)的調(diào)用中,主調(diào)函數(shù)通過實參將

9、數(shù)據(jù)傳遞給被調(diào)函數(shù)的形參,從而實現(xiàn)函數(shù)間的數(shù)據(jù)傳遞。主調(diào)函數(shù)與被調(diào)函數(shù)間用參數(shù)傳遞數(shù)據(jù)的方式有兩種:傳傳值方式值方式與傳址方式傳址方式。 傳值方式傳值方式實際上是一種單向傳遞(或稱為復(fù)制方式),主調(diào)函數(shù)的實參將數(shù)據(jù)值復(fù)制到被調(diào)函數(shù)形參的存儲單元中,而本身并不進入被調(diào)函數(shù)內(nèi)部。一旦數(shù)據(jù)傳遞結(jié)束,實參和形參就互不相干,無論形參在被調(diào)函數(shù)中如何變化都不會對實參產(chǎn)生任何影響。 例例 3.4(P100)程序分析程序分析 傳址方式傳址方式將在以后用到時進行介紹。3.1.3 3.1.3 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞3.1 3.1 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n函數(shù)的定義函數(shù)的定義

10、n函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用n函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞n函數(shù)的返回方式函數(shù)的返回方式n嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用1. 有返回值格式有返回值格式return 表達式;表達式;其執(zhí)行過程如下: (1)先計算出表達式的值; (2)若表達式的類型和函數(shù)類型不同時,將表達式的類型自動轉(zhuǎn)換為函數(shù)類型,這種轉(zhuǎn)換是強制性的,可能出現(xiàn)不保值的現(xiàn)象; (3)將計算出的表達式的值傳給主調(diào)函數(shù),然后將程序控制權(quán)交給主調(diào)函數(shù)。此時主調(diào)函數(shù)接管控制權(quán),繼續(xù)執(zhí)行主調(diào)函數(shù)調(diào)用語句后的語句。3.1.4 3.1.4 函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞 無返回值格式為:return; 無返回值格式函數(shù)必須定義為voi

11、d類型,并可省略返回語句return。 其執(zhí)行過程如下: 當(dāng)被調(diào)函數(shù)執(zhí)行到該語句時將程序控制權(quán)交回給主調(diào)函數(shù),此時主調(diào)函數(shù)接管控制權(quán),繼續(xù)執(zhí)行主調(diào)函數(shù)中調(diào)用該被調(diào)函數(shù)的后繼語句。 例例3.5(P101)分析分析2. 無返回值格式無返回值格式3.1 3.1 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n函數(shù)的定義函數(shù)的定義n函數(shù)的說明和調(diào)用函數(shù)的說明和調(diào)用n函數(shù)的參數(shù)傳遞函數(shù)的參數(shù)傳遞n函數(shù)的返回方式函數(shù)的返回方式n嵌套調(diào)用和遞歸調(diào)用嵌套調(diào)用和遞歸調(diào)用3.1.3 3.1.3 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用和遞歸調(diào)用和遞歸調(diào)用1. 函數(shù)嵌套調(diào)用的概念函數(shù)嵌套調(diào)用的概念(1)嵌套調(diào)用的概念

12、)嵌套調(diào)用的概念 C語言規(guī)定,在C程序中所有的函數(shù)都是平行的,這就是說在C的函數(shù)中不能嵌套定義別的函數(shù)。因此,如果一個函數(shù)中要使用另外的函數(shù),那就只能采取調(diào)用其他函數(shù)的辦法。對于復(fù)雜問題的程序設(shè)計,這就必然會出現(xiàn)被調(diào)函數(shù)再調(diào)用其他函數(shù)的情況。 這種一個函數(shù)在被調(diào)用過程中又調(diào)用另一個函數(shù)的情況,就稱為嵌套調(diào)用。(1)嵌套調(diào)用的概念)嵌套調(diào)用的概念函數(shù)函數(shù)1函數(shù)函數(shù)2函數(shù)函數(shù)3函數(shù)函數(shù)4調(diào)用函數(shù)調(diào)用函數(shù)2函數(shù)函數(shù)1結(jié)束結(jié)束調(diào)用函數(shù)調(diào)用函數(shù)3函數(shù)函數(shù)2結(jié)束結(jié)束調(diào)用函數(shù)調(diào)用函數(shù)4函數(shù)函數(shù)3結(jié)束結(jié)束函數(shù)函數(shù)4結(jié)束結(jié)束例例 用二分法求方程 x35x2 + 16x80 = 0 的根。 (1)設(shè)f(x)= x

13、35x2 + 16x80,則方程為: f(x) = 0 (2)取一個初始區(qū)間(x1, x2),使得: f(x1)* f(x2)0 (3)找出區(qū)間的中點x,即: x = (x1 + x2)/ 2 (4)判斷 f(x)是否達到收斂精度: | f(x)| ? 是,得到方程的根;否,進行下一步。 (5)判斷 f(x)* f(x1)0 ? 是,令x1= x;否,令x2= x。然后返回第(2)步重復(fù)執(zhí)行。(2) 嵌套調(diào)用實例嵌套調(diào)用實例Xx1x2xY0 x*f(x)二分法求解過程二分法求解過程將以上的功能分別用以下幾個函數(shù)來完成: (1)方程函數(shù) f(x),計算方程右邊的值; (2)中點函數(shù) mid(x1

14、, x2),計算區(qū)間的中點; (3)求根函數(shù) root(x1, x2),判定是否找到方程的根; (4)主函數(shù) main( ),起主調(diào)用作用,并確定根的初始區(qū)間。 程序見程序見EXM1.C2.2.函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用(1) 遞歸調(diào)用的概念遞歸調(diào)用的概念 函數(shù)的遞歸調(diào)用,就是指函數(shù)直接或間接地調(diào)用自己。相應(yīng)的函數(shù)也稱為遞歸函數(shù)(recursive function)。從本質(zhì)上講,遞歸調(diào)用實際上是一種特殊的嵌套調(diào)用。 函數(shù)的遞歸調(diào)用有兩種形式:直接調(diào)用和間接調(diào)用。 直接調(diào)用 間接調(diào)用 int fn(int x,int y) int f1(int x) int f2(int u) int a,

15、b,z; int y,z; int v,w; z= fn(a,b); z = f2(y); w = f1(v); return(2* z); return(z); return(w); 下面以一個例子來理解遞歸調(diào)用的機制。 順序坐著5個人,問第5個人的年齡,他比第4個人大2歲;第4個人比第3個人大2歲;第3個人比第2個人大2歲;第2個人又比第1個人大2歲;問到最后一個,他說是10歲。請問第5個人多大年紀(jì)? 這是一個明顯的遞歸問題,只有推到最后一個才能反算出結(jié)果。即: age(5) = age(4) + 2 歸納成數(shù)學(xué)表達式: age(4) = age(3) + 2 age(3) = age(2

16、) + 2 age(2) = age(1) + 2 age(1) = 10 )()()()(12111nnagennage(2) 遞歸調(diào)用機制遞歸調(diào)用機制 遞推過程為: 反算過程為: age(5)=age(4)+2 age(5) = 18 age(4)=age(3)+2 age(4)=16 age(3)=age(2)+2 age(3)=14 age(2)=age(1)+2 age(2)=12 age(1) = 10 設(shè)計的程序為: #include int age( int n ) int c; if ( n = = 1) c = 10; else c = age( n1) + 2; retu

17、rn(c); void main( ) printf(“%d n”,age(5); 從此例可以得知: (1)遞歸調(diào)用必須要有一個終止條件,否則將無限調(diào)用下去; (2)每次調(diào)用時,函數(shù)的執(zhí)行并未完畢,系統(tǒng)將提供一個特殊的內(nèi)存空間(??臻g或堆棧)把未完成的操作逐個存放在里面(壓棧),當(dāng)遞歸調(diào)用結(jié)束時,系統(tǒng)再將棧內(nèi)存放的未完成操作按后進先出順序逐一取出(出棧)完成操作,最終得到函數(shù)的調(diào)用結(jié)果。 遞歸調(diào)用可使設(shè)計的程序精練,但設(shè)計有一定的難度,在不熟練的情況下,不一定非采用遞歸調(diào)用方式設(shè)計函數(shù)。(3) 遞歸調(diào)用說明遞歸調(diào)用說明 在函數(shù)調(diào)用時,實參可以是表達式,也就存在表達式的運算問題。C規(guī)定,函數(shù)實參

18、的運算依從右到左的順序?qū)崊⒈磉_式進行運算。因此, int n=2000; printf(“%d,%d,%dn”, n+,n+,n+);的輸出結(jié)果為: 2002,2001,2000而不是: 2000,2001,20023.3.函數(shù)調(diào)用中實參的執(zhí)行問題函數(shù)調(diào)用中實參的執(zhí)行問題3 3 模塊化程序設(shè)計模塊化程序設(shè)計本章主要內(nèi)容本章主要內(nèi)容1. 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用2. 作用域和存儲類別作用域和存儲類別 3. 編譯預(yù)處理編譯預(yù)處理4. 系統(tǒng)函數(shù)系統(tǒng)函數(shù)5. 應(yīng)用程序舉例應(yīng)用程序舉例3.2 3.2 作用域和存儲類別作用域和存儲類別本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n變量的作用域變量的作用域n變量的存儲

19、類別變量的存儲類別n外部函數(shù)和內(nèi)部函數(shù)外部函數(shù)和內(nèi)部函數(shù)1. 作用域的概念作用域的概念 作用域?qū)嶋H上就是程序中各種標(biāo)識符起作用的范圍。在C程序中標(biāo)識符定義在不同的位置,起作用的范圍是不同的。 以變量為例,由于定義在程序中的位置不同,變量可分為局部變量和全局變量。按其定義位置,它們的作用域可分為:塊級作用域、函數(shù)級作用域、文件級作用域、程序級作用域。 變量在其作用域中總是存在的,但它的值不一定能夠獲得,因為它可能被更小作用域的同名變量所屏蔽。 3.2.1 3.2.1 變量的作用域變量的作用域 凡是定義在函數(shù)內(nèi)部的變量都是局部變量。它們的作用域都局限在函數(shù)的內(nèi)部。 局部變量的特點有: (1)每個函

20、數(shù)所定義的變量都只在該函數(shù)中有效,別的函數(shù)不能使用。 (2)形參也是局部變量,在整個函數(shù)中有效。 (3)同一程序中的不同函數(shù)所定義的局部變量可以同名,互不相關(guān)。 (4)復(fù)合語句中也可以定義局部變量,其作用域到該復(fù)合語句結(jié)束為止。 例如:例如:2. 局部變量局部變量float f1(int a) int b, c; int f2(char c) float x, y; void main( ) char a, b; int a, b; a的作用域的作用域b和和c的作用的作用域域x和和y的作用域的作用域c的作用域的作用域整型變量整型變量a和和b的作用域,在的作用域,在此范圍內(nèi)將屏此范圍內(nèi)將屏蔽字符

21、型變量蔽字符型變量a和和b的作用的作用字符型變量字符型變量a和和b的作用域的作用域 凡是定義在函數(shù)外部的變量就稱為全局變量,也叫外部變量。其作用域從定義位置開始到本源程序文件結(jié)束。 全局變量的特點有: (1)用于不同函數(shù)間的數(shù)據(jù)聯(lián)系。 (2)從定義位置開始對以后的所有函數(shù)起作用(包括其他文件中的),但也可以用extern來擴展作用范圍到定義前的函數(shù)。 (3)在其作用域中將被同名局部變量屏蔽。 (4)盡可能少用全局變量,避免降低函數(shù)的獨立性。 例如:例如:3. 全局變量全局變量int x, y;float f1(int a) int b, c; char a, b;int f2(char c)

22、float x, y; void main( ) char a, b; 局 部 變 量局 部 變 量 a和和 b 在 此 范在 此 范圍內(nèi)將屏蔽圍內(nèi)將屏蔽全 局 變 量全 局 變 量 a和和b的作用的作用局 部 變 量局 部 變 量 x和和 y 在 此 范在 此 范圍內(nèi)將屏蔽圍內(nèi)將屏蔽全 局 變 量全 局 變 量 x和和y的作用的作用全局變量全局變量a和和b的作的作用域用域全局變量全局變量x和和y的作的作用域用域3.2 3.2 作用域和存儲類別作用域和存儲類別本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n變量的作用域變量的作用域n變量的存儲類別變量的存儲類別n外部函數(shù)和內(nèi)部函數(shù)外部函數(shù)和內(nèi)部函數(shù)1變量的屬性變量的

23、屬性變量有兩個屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲類別。(1)數(shù)據(jù)類型)數(shù)據(jù)類型:決定數(shù)據(jù)存儲空間的大小。四大類(基本型、構(gòu)造型、指針型和空類型)。(2)存儲類別:)存儲類別:決定數(shù)據(jù)的存儲位置。兩大類:動態(tài)存儲類和靜態(tài)存儲類,四種具體類別:自動型、靜態(tài)型、寄存器型和外部型。3.2.2 3.2.2 變量的存儲類別變量的存儲類別程序區(qū)程序區(qū)靜態(tài)存儲區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)動態(tài)存儲區(qū)用戶數(shù)據(jù)區(qū)用戶數(shù)據(jù)區(qū)(1)動態(tài)存儲方式動態(tài)存儲方式 在程序運行期間根據(jù)需要對存儲空間進行動態(tài)的分配。 如:函數(shù)的形參,普通的局部變量等。 這些變量在函數(shù)調(diào)用結(jié)束時,分配的存儲單元就被收回。(2)靜態(tài)存儲方式靜態(tài)存儲方式 在程序運行

24、期間對變量分配固定的存儲單元。 如:全局變量,靜態(tài)變量等。 這些變量所分配的存儲單元直到程序運行結(jié)束才被收回。 2. 動態(tài)存儲方式與靜態(tài)存儲方式動態(tài)存儲方式與靜態(tài)存儲方式 函數(shù)中未進行其他存儲類別說明的局部變量,都是自動變量(auto型),運行時都按動態(tài)方式分配存儲單元。 函數(shù)的形參、函數(shù)內(nèi)定義的局部變量通常都是自動變量,在實際使用中省略了關(guān)鍵詞auto。如果要定義為其他存儲類別則必須明確寫出關(guān)鍵詞。 自動變量是在函數(shù)調(diào)用時臨時劃定存儲區(qū)域,因此,未賦初值時存儲單元內(nèi)是隨機值。3. 自動變量(自動變量(auto) 如果某些變量的值在函數(shù)調(diào)用結(jié)束后仍然需要保留,則需要將變量的存儲單元分配在靜態(tài)存

25、儲區(qū)內(nèi)。聲明格式為:static 數(shù)據(jù)數(shù)據(jù)類型類型 變量表列;變量表列;使用時注意:(1)static可定義靜態(tài)外部變量和靜態(tài)內(nèi)部變量。靜態(tài)外部變量的作用域在所定義的文件內(nèi),靜態(tài)內(nèi)部變量的同局部變量。(2)靜態(tài)變量在函數(shù)調(diào)用結(jié)束時不釋放存儲空間,仍保留原有值,下次調(diào)用該函數(shù)時,其值仍可繼續(xù)使用。(3)靜態(tài)變量的初值是在編譯時賦給,因此,未賦初值的靜態(tài)變量初值自動設(shè)置為0。4. 靜態(tài)變量(靜態(tài)變量(static) 將存儲單元分配在CPU寄存器中的變量叫做寄存器變量,其主要目的是提高對該變量的訪問速度。聲明格式為:register 數(shù)據(jù)數(shù)據(jù)類型類型 變量表列;變量表列; 使用時注意:(1)只有自動

26、局部變量和函數(shù)的形參可定義成寄存器變量;(2)CPU的寄存器有限,超出寄存器分配容量的寄存器變量將自動成為自動變量;(3)注意,由于寄存器變量不占用內(nèi)存單元,所以沒有內(nèi)存地址,因此,不能用&算符獲取地址。5. 寄存器變量(寄存器變量(register)3.2 3.2 作用域和存儲類別作用域和存儲類別本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n變量的作用域變量的作用域n變量的存儲類別變量的存儲類別n外部函數(shù)和內(nèi)部函數(shù)外部函數(shù)和內(nèi)部函數(shù)1. 外部函數(shù)外部函數(shù) 外部函數(shù)用extern來定義,由于extern可以省略,因此,未做存儲類別說明的函數(shù)都是外部函數(shù)。 外部函數(shù)可以被所在程序中的其他函數(shù)所調(diào)用,但如果調(diào)

27、用程序不在同一個文件中時,必須在主調(diào)用程序中用extern說明被調(diào)函數(shù)。 (見(見P119程序結(jié)構(gòu)說明)程序結(jié)構(gòu)說明)2. 內(nèi)部函數(shù)內(nèi)部函數(shù) 內(nèi)部函數(shù)用static來定義。凡定義成內(nèi)部函數(shù),就只能被所定義的文件中的函數(shù)調(diào)用,程序其他文件中的函數(shù)不能調(diào)用它。3.2.3 3.2.3 外部函數(shù)和內(nèi)部函數(shù)外部函數(shù)和內(nèi)部函數(shù)3 3 模塊化程序設(shè)計模塊化程序設(shè)計本章主要內(nèi)容本章主要內(nèi)容1. 函數(shù)的定義和調(diào)用函數(shù)的定義和調(diào)用2. 作用域和存儲類別作用域和存儲類別 3. 編譯預(yù)處理編譯預(yù)處理4. 系統(tǒng)函數(shù)系統(tǒng)函數(shù)5. 應(yīng)用程序舉例應(yīng)用程序舉例3.3 3.3 編譯預(yù)處理編譯預(yù)處理本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n文件包

28、含處理文件包含處理n宏定義宏定義 文件包含的預(yù)編譯語句的一般形式為:#include 或或 #inlude “文件名文件名” 被包含的文件可以是系統(tǒng)提供的,也可以是用戶自己設(shè)計的。包含的作用就是將被包含文件嵌入到該文件的指定位置。還可以嵌套包含。ABBCCCCBAfile1包含包含file2file2包含包含file3file3最終的最終的file13.3.1 3.3.1 文件包含文件包含3.3 3.3 編譯預(yù)處理編譯預(yù)處理本節(jié)主要內(nèi)容本節(jié)主要內(nèi)容n文件包含處理文件包含處理n宏定義宏定義3.3.2 3.3.2 宏定義宏定義 所謂的宏,就是用#define定義的,用于代表一組字符串的標(biāo)識符。宏定

29、義分為兩種:不帶參數(shù)的宏定義和帶參數(shù)的宏定義。 1. 不帶參數(shù)的宏定義不帶參數(shù)的宏定義#define 標(biāo)識符標(biāo)識符 字符串字符串 其中,標(biāo)識符為宏名,也叫符號常量,通常用大寫字母表示;字符串為宏名所代表的值或功能,可以是常量、也可以是表達式或語句,還可以包含已經(jīng)定義過的宏。例如: #define PI 3.14159 PI代表常量3.14159 #define D 2*PI D代表表達式2*PI的值 #define Circ retur(D*PI); Circ代表語句return(D*PI);#define 標(biāo)識符標(biāo)識符(形參表形參表) 表達式表達式 其中,標(biāo)識符(宏名)在其作用域中代表語句中

30、表達式的功能;形參表所列的形參為表達式中要用到的參數(shù);在使用宏的時候,只需在參數(shù)表的位置換上相應(yīng)的實參就可以得到宏所代表的表達式的值。 例如:定義一個宏 #define S( a,b) (a)*(b) 調(diào)用這個宏 x = S( 2,3) ;注意:注意: 如果定義的表達式中a和b不加括號,調(diào)用時用: x=S(1+1,2+1)結(jié)果將如何結(jié)果將如何? 請上機試試,想想為什么?請上機試試,想想為什么?2. 帶參數(shù)的宏定義帶參數(shù)的宏定義S(a,b)S(2,3)(a)*(b)(2)*(3) (1)函數(shù)調(diào)用會發(fā)生程序控制流程轉(zhuǎn)移,帶參數(shù)的宏調(diào)用不會; (2)函數(shù)要求有確定的數(shù)據(jù)類型,帶參數(shù)的宏不要求,運算結(jié)果的類型隨帶入的參數(shù)而定; (3)函數(shù)的實參有數(shù)據(jù)類型限制,宏的實參沒有; (4)函數(shù)調(diào)用時存在實參向形參傳遞數(shù)據(jù)的過

溫馨提示

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

評論

0/150

提交評論