C語(yǔ)言程序設(shè)計(jì)第4章函數(shù)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)第4章函數(shù)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)第4章函數(shù)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)第4章函數(shù)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)第4章函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第4章函數(shù)4.1函數(shù)概述

這個(gè)程序由三個(gè)函數(shù)構(gòu)成:main()、S()和L(),若按照模塊化的觀點(diǎn)看,這個(gè)程序由三個(gè)模塊構(gòu)成,每個(gè)模塊由一個(gè)函數(shù)實(shí)現(xiàn)。

/*求圓面積函數(shù)*/

floatS(floatr){floatres;res=3.14*r*r;returnres;}/*求圓周長(zhǎng)函數(shù)*/

floatL(floatr){floatres;res=2*3.14*r;returnres;}

main(){floatr,area,circle;

printf(“Pleaseinputradius:”);

scanf(“%f”,&r);area=S(r);circle=L(r);

printf(“r=%f,s=%f,l=%f\n”,r,area,circle);}例4.1main()、S()和L()的關(guān)系圖main()S()L()4.2函數(shù)的定義從用戶使用的角度看,可將函數(shù)分為兩種:標(biāo)準(zhǔn)函數(shù)(即系統(tǒng)庫(kù)函數(shù))和用戶自定義函數(shù)。函數(shù)的定義格式:

類型標(biāo)識(shí)符

函數(shù)名([<形式參數(shù)表>])

{

函數(shù)體

}對(duì)于函數(shù)的定義格式要注意以下幾點(diǎn):

1.“類型標(biāo)識(shí)符”用來(lái)說(shuō)明函數(shù)返回值的類型。當(dāng)函數(shù)的返回值為整型(int)時(shí),也可以不加“類型標(biāo)識(shí)符”,因?yàn)橄到y(tǒng)默認(rèn)的返回類型是整型。

2.“函數(shù)名”是函數(shù)的存在標(biāo)識(shí),函數(shù)名可以是任何合法字符的組合,但注意不要與系統(tǒng)關(guān)鍵字同名。

3.“<形式參數(shù)表>”用于指明調(diào)用函數(shù)時(shí),傳遞給函數(shù)的數(shù)據(jù)個(gè)數(shù)和類型。傳遞給函數(shù)的參數(shù)可以有多個(gè),也可以沒(méi)有。若有多個(gè)參數(shù),則相鄰參數(shù)之間要用逗號(hào)“,”間隔;若沒(méi)有參數(shù),則<形式參數(shù)表>為空,但要保留“函數(shù)名”后的一對(duì)括弧“()”。

4.函數(shù)若有多個(gè)參數(shù),則必須在<形式參數(shù)表>中對(duì)每一個(gè)參數(shù)進(jìn)行類型聲明,格式為:

“類型名1形式參數(shù)名1,類型名2形式參數(shù)名2,......,類型名n形式參數(shù)名n”。

5.“函數(shù)體”就是函數(shù)的定義主體,包括變量聲明、程序語(yǔ)句等。例4.2:定義一個(gè)求和函數(shù)來(lái)說(shuō)明函數(shù)的定義格式

/*定義了兩個(gè)浮點(diǎn)型的形參x和y,函數(shù)返回類型為浮點(diǎn)型*/

floatsum(floatx,floaty){floatz;/*定義一浮點(diǎn)型變量z*/z=x+y; return(z);/*將z的值作為函數(shù)sum的結(jié)果*/}4.3函數(shù)的調(diào)用與返回值

函數(shù)定義好之后,要能夠被調(diào)用(即執(zhí)行函數(shù)),以完成該函數(shù)的功能。函數(shù)的調(diào)用格式:

函數(shù)名([<實(shí)際參數(shù)表>])

在函數(shù)的定義格式中,函數(shù)頭為:

類型標(biāo)識(shí)符函數(shù)名([<形式參數(shù)表>])

這里要注意的是“實(shí)際參數(shù)表”和“形式參數(shù)表”的區(qū)別。4.3.1實(shí)參與形參的區(qū)分

“形參表”是一種形式上的定義,或者說(shuō)是一種“接口”描述,通過(guò)這個(gè)接口,調(diào)用者就知道應(yīng)該給函數(shù)傳遞什么樣的數(shù)據(jù)。

調(diào)用者在調(diào)用某函數(shù)時(shí),通過(guò)接口傳給函數(shù)的實(shí)際數(shù)據(jù),叫做“實(shí)參”。通過(guò)下面的圖,能較好地理解形參和實(shí)參的關(guān)系:

#include<stdio.h>min(intx,inty){

intz;z=x<y?x:y;return(z);}

main(){inta,b,c;

scanf(“%d,%d”,&a,&b);c=min(a,b);

printf(“Minis%d\n”,c);}例4.3:通過(guò)調(diào)用求最小值函數(shù)min(),來(lái)說(shuō)明函數(shù)調(diào)用時(shí)形參和實(shí)參的關(guān)系

程序運(yùn)行結(jié)果如下:

6,9↙

Minis64.3.2函數(shù)的調(diào)用函數(shù)的調(diào)用方式有以下三種:

1.函數(shù)語(yǔ)句

把函數(shù)調(diào)用作為一個(gè)語(yǔ)句出現(xiàn)。這種調(diào)用方式無(wú)需函數(shù)有返回值,只要它完成某項(xiàng)功能。

2.函數(shù)表達(dá)式

當(dāng)調(diào)用的函數(shù)有返回值時(shí),有時(shí)會(huì)以表達(dá)式的方式調(diào)用該函數(shù)。

3.函數(shù)參數(shù)

函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參,這是實(shí)際當(dāng)中用得較多的一種方式。

4.3.3對(duì)被調(diào)用函數(shù)的聲明

一個(gè)函數(shù)要獲得對(duì)另一個(gè)函數(shù)的調(diào)用成功,除了參數(shù)要正確傳遞以外,還必須具備以下一些條件:1.如果調(diào)用系統(tǒng)庫(kù)函數(shù),應(yīng)在程序文件開(kāi)頭用#include命令將包含庫(kù)函數(shù)定義信息的“頭文件”嵌入到文件中來(lái)。

2.如果在程序中調(diào)用用戶自定義函數(shù),一般還應(yīng)在程序中對(duì)被調(diào)函數(shù)進(jìn)行“聲明”。

#include<stdio.h>main(){floatsum(floatx,floaty);

floata,b,c;

scanf(“%f,%f”,&a,&b);c=sum(a,b);

printf(“Sumis%f\n”,c);}floatsum(floatx,floaty){floatz;z=x+y;return(z);}

例4.4:該例說(shuō)明如何對(duì)被調(diào)用函數(shù)進(jìn)行聲明程序運(yùn)行結(jié)果如下:

3.6,7.5↙

Sumis11.100000

函數(shù)原型有兩種寫(xiě)法:

1.類型標(biāo)識(shí)符

函數(shù)名(參數(shù)類型1,參數(shù)類型2…….)

2.類型標(biāo)識(shí)符函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2…….)

使用函數(shù)原型還要注意以下兩點(diǎn):

1.如果被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,則主調(diào)函數(shù)中可以不加聲明。

2.如果在所有函數(shù)定義之前已做了函數(shù)聲明,則各主調(diào)函數(shù)不必再對(duì)其進(jìn)行聲明。4.3.4函數(shù)的返回語(yǔ)句與返回值

在執(zhí)行被調(diào)用函數(shù)時(shí),如果要將控制或被調(diào)用函數(shù)的值返回給調(diào)用函數(shù),則需要使用返回語(yǔ)句。返回語(yǔ)句有三種格式:

格式1:return;

格式2:return(表達(dá)式);

格式3:return表達(dá)式;使用返回語(yǔ)句要注意以下幾點(diǎn):

1.如果被調(diào)函數(shù)中沒(méi)有返回語(yǔ)句return,則執(zhí)行完該函數(shù)體的最后一條語(yǔ)句才返回。

2.如果被調(diào)函數(shù)有返回值,則必須使用格式2或格式3的返回語(yǔ)句,且要在函數(shù)定義時(shí)聲明函數(shù)的返回類型。如例4.4中定義的sum()函數(shù):

floatsum(floatx,floaty){floatz;z=x+y;return(z);}

#include<stdio.h>

intmax(float,float);/*函數(shù)原型聲明*/

main(){floata=1.5,b=3.2;

printf(“Maxis%d\n”,max(a,b));}

intmax(floatx,floaty){return(x>y?x:y);}例4.6:該例說(shuō)明當(dāng)返回類型與函數(shù)類型不一致時(shí)如何處理

程序運(yùn)行結(jié)果為:

Maxis3補(bǔ)充說(shuō)明:如果函數(shù)沒(méi)有返回值,則應(yīng)給函數(shù)加上類型聲明符“void”,意為“無(wú)返回值”的意思。

一個(gè)函數(shù)中可以有多條return語(yǔ)句,執(zhí)行到哪一個(gè),哪一個(gè)語(yǔ)句起作用。

4.4函數(shù)的參數(shù)傳遞方式

實(shí)參與形參的傳遞方式有兩種:值傳遞方式和地址傳遞方式。所謂“值”就是某個(gè)常量、變量、函數(shù)、表達(dá)式的計(jì)算結(jié)果。變量或常量,是無(wú)需計(jì)算的,因?yàn)樗鼈儽旧砭褪且粋€(gè)值;函數(shù)的值是指它的返回值;表達(dá)式的值就是它的計(jì)算結(jié)果。

值傳遞方式的特點(diǎn)是:將實(shí)參的值傳給形參,實(shí)參與形參互不影響,在函數(shù)內(nèi)部對(duì)形參所做的任何改變不會(huì)影響到實(shí)參。4.4.1值傳遞方式

#include<stdio.h>voidf(intx,inty){++x;--y;

printf(“\nx=%d,y=%d”,x,y);}

main(){inta,b;a=b=10;printf(“\na=%d,b=%d”,a,b);f(a,b);/*傳值*/printf(“\na=%d,b=%d”,a,b);}例4.9:該例說(shuō)明值傳遞方式的特點(diǎn)

程序運(yùn)行結(jié)果為:

a=10,b=10x=11,y=9a=10,b=104.4.2地址傳遞方式

程序運(yùn)行時(shí),其中的任何數(shù)據(jù)(常量或變量),都要占據(jù)一定大小的內(nèi)存單元(如一個(gè)整數(shù)占兩個(gè)字節(jié),一個(gè)實(shí)型數(shù)占四個(gè)字節(jié)),它所占據(jù)的內(nèi)存單元在整個(gè)內(nèi)存空間中的位置就叫“地址”。要獲得某個(gè)變量的內(nèi)存地址,C語(yǔ)言提供了一個(gè)運(yùn)算符“&”,只要將該運(yùn)算符與某個(gè)變量連接起來(lái),運(yùn)算的結(jié)果就是該變量的“地址”。如:“&a”,求得的結(jié)果就是變量a所分配的內(nèi)存單元地址。

#include<stdio.h>voidf(int*x,int*y){++(*x);--(*y);

printf(“\nx=%d,y=%d”,*x,*y);}

main(){

inta,b;a=b=10;

printf(“\na=%d,b=%d”,a,b);f(&a,&b);/*傳地址*/

printf(“\na=%d,b=%d”,a,b);}

程序運(yùn)行結(jié)果為:

a=10,b=10x=11,y=9a=11,b=94.5函數(shù)的嵌套與遞歸4.5.1函數(shù)的嵌套調(diào)用

所謂“嵌套調(diào)用”就是一個(gè)被調(diào)函數(shù),在它執(zhí)行還未結(jié)束之前又去調(diào)用另一個(gè)函數(shù),這種調(diào)用關(guān)系可以有嵌套多層。關(guān)于嵌套調(diào)用關(guān)系如下圖所示:

fun2(inta,intb){intc;c=a*b%3;returnc;}fun1(inta,intb){intc;a+=a;b+=b;c=fun2(a,b);returnc*c;}

main(){intx=2,y=7;

printf(“Theresultis:%d\n”,fun1(x,y));}例4.10:該例介紹函數(shù)的嵌套調(diào)用

程序運(yùn)行結(jié)果:

Theresultis:44.5.2函數(shù)的遞歸調(diào)用

函數(shù)的嵌套調(diào)用是指某函數(shù)調(diào)用另一個(gè)不同的函數(shù);如果函數(shù)調(diào)用本身,則稱為“遞歸調(diào)用”。函數(shù)a直接調(diào)用a本身,稱“直接遞歸”,函數(shù)a調(diào)用函數(shù)b,b再調(diào)用a,稱“間接遞歸”。

#include<stdio.h>floatfac(intk){if(k==0)return1;elsereturnk*fac(k-1);}main(){

intm;

printf(“m=”);

scanf(“%d”,&m);

printf(“%d!=%f\n”,m,fac(m));}

程序運(yùn)行結(jié)果:

m=3

↙3!=6.000000

例4.12:用遞歸計(jì)算階乘k!

遞歸調(diào)用圖解:4.6變量的作用域

什么是“變量的作用域”?可以打一個(gè)這樣的比方:每個(gè)變量好比一盞燈,它所能照亮的區(qū)域就是它的“作用域”,在該區(qū)域內(nèi)的任何地方都能“看到”它,也就能訪問(wèn)到該變量,出了此區(qū)域就訪問(wèn)不到了。4.6.1局部變量

局部變量是局部可見(jiàn)的,主要指在函數(shù)體內(nèi)定義的變量。在函數(shù)體內(nèi)定義的變量只有在該函數(shù)范圍內(nèi)才能被訪問(wèn)到,在此函數(shù)以外是不能訪問(wèn)的。4.6.2全局變量

如果說(shuō)局部變量是一個(gè)只能照射到局部區(qū)域的“燈”,那么全局變量就是一盞能照射到整個(gè)程序范圍的“燈”,因此,程序中的任何地方都能訪問(wèn)到全局變量(絕大多數(shù)情況下是這樣的)。

什么樣的變量才是全局變量呢?簡(jiǎn)單地說(shuō):在函數(shù)之外定義的變量就是全局變量(也可稱為外部變量),它的作用域?yàn)閺亩x變量開(kāi)始的位置到程序的結(jié)束所覆蓋的范圍。

#include<stdio.h>intx;fun(inta,intb){

intt;t=a;a=b;b=t;x=a/b;

printf(“theresultis:%d\n”,x);}

main(){

inta=5,b=12;fun(a,b);

printf(“a=%d,b=%d,x=%d\n”,a,b,x);}

程序運(yùn)行結(jié)果:

theresultis:2a=5,b=12,x=2例4.15:該例說(shuō)明全局變量的使用

4.6.3分程序

在C語(yǔ)言中,一個(gè)大的程序可以由多個(gè)函數(shù)組成,這些函數(shù)的定義是并列的。C語(yǔ)言不允許在函數(shù)內(nèi)部再定義函數(shù),即函數(shù)定義不能嵌套。

C語(yǔ)言為彌補(bǔ)這一不足,允許使用“分程序”。所謂“分程序”就是用一對(duì)花括號(hào)“{”和“}”括起來(lái)的含有變量聲明語(yǔ)句和執(zhí)行語(yǔ)句的“復(fù)合語(yǔ)句”,其形式如下:

{

變量聲明語(yǔ)句

……

執(zhí)行語(yǔ)句序列

……}

程序運(yùn)行結(jié)果:

x=7,y=9,z=3x

=2,y=3,z=44.7變量的生存期上一節(jié)從變量的作用域角度將變量分為局部變量和全局變量?jī)煞N。

另外,變量是有“生存期”的,即任何變量都有一個(gè)“創(chuàng)建”、“存在”、“消亡”的過(guò)程。變量的生存期取決于它的存儲(chǔ)類別。所謂“存儲(chǔ)類別”,是指系統(tǒng)為變量分配的具有某種特性的存儲(chǔ)區(qū)域。存儲(chǔ)區(qū)域一般分為兩種:靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)。存放在靜態(tài)存儲(chǔ)區(qū)中的變量在程序運(yùn)行初期就被創(chuàng)建,它們的壽命往往是與程序同步;存放在動(dòng)態(tài)存儲(chǔ)區(qū)中的變量是臨時(shí)性的,在程序運(yùn)行期間隨時(shí)會(huì)被撤銷(xiāo)。

程序執(zhí)行時(shí)的存儲(chǔ)區(qū)域劃分:4.7.1自動(dòng)變量(auto)

在前面所有例子的函數(shù)當(dāng)中定義的變量實(shí)際上都是自動(dòng)變量,只是省略了關(guān)鍵字“auto”。自動(dòng)變量只是定義在函數(shù)中的,當(dāng)函數(shù)被調(diào)用時(shí),自動(dòng)變量臨時(shí)被創(chuàng)建于動(dòng)態(tài)存儲(chǔ)區(qū)中,函數(shù)執(zhí)行完畢,自動(dòng)撤銷(xiāo)。聲明自動(dòng)變量的完整格式如下:

auto類型名

變量表;

#include<stdio.h>voidsub(){/*顯式聲明y為自動(dòng)變量*/

autointy=3;

printf(“y=%d\n”,y);}main(){/*隱式聲明y為自動(dòng)變量*/

inty=2;sub();

printf(“y=%d\n”,y);}

程序運(yùn)行結(jié)果:

y=3y=2例4.18:該例說(shuō)明自動(dòng)變量的性質(zhì)和用途

4.7.2靜態(tài)變量(static)“靜態(tài)變量”與“自動(dòng)變量”的區(qū)別:

先看它們的相同點(diǎn):二者都是定義在函數(shù)內(nèi)的局部變量,所以,它們的作用域都是在函數(shù)內(nèi),出了該函數(shù),二者都不能被訪問(wèn)。

不同點(diǎn):二者的壽命不同。(自動(dòng))局部變量是函數(shù)執(zhí)行時(shí)才存在,執(zhí)行完了自動(dòng)撤銷(xiāo),是動(dòng)態(tài)的。而靜態(tài)變量存在于靜態(tài)存儲(chǔ)區(qū)中,在函數(shù)執(zhí)行之前就存在,壽命是全局的,即與程序同步。

確切地說(shuō),在函數(shù)中聲明的靜態(tài)變量不論其所在的函數(shù)是否被調(diào)用,它一直存在。如果其所在的函數(shù)被調(diào)用,且在執(zhí)行期間修改了靜態(tài)變量的值,則在函數(shù)執(zhí)行完后,該值仍存在,并將作為下一次調(diào)用該函數(shù)的初值。

聲明靜態(tài)變量的格式為:

static類型名

變量表;

#include<stdio.h>sub(){/*聲明靜態(tài)局部變量i,并置初值為1*/

staticinti=1;i=2*i;return(i);}main(){

inti;for(i=1;i<=4;i++)

printf(“\nresult=%d”,sub());}程序運(yùn)行結(jié)果:

result=2result=4result=8result=16例4.19:該例說(shuō)明靜態(tài)變量的性質(zhì)和作用

4.7.3外部變量(extern)

關(guān)鍵字“extern”用來(lái)擴(kuò)展全局變量的作用域,使得以前不能訪問(wèn)它的函數(shù)也能訪問(wèn)到它,這種作用域的擴(kuò)展,也稱為作用域的“提升”。

extern的聲明格式為:

extern[類型名]變量表;

由于變量表中的變量往往已定義,類型名通常都省略。#include<stdio.h>intmin(inta,intb){return(a<b?a:b);}main(){externX,Y;

printf(“\nmin=%d”,min(X,Y));}

intX=9,Y=-14;

程序運(yùn)行結(jié)果:

min=-14例4.20:該例說(shuō)明對(duì)外部變量的聲明和使用

此例中,在file1.c文件中全局變量A在定義時(shí)加上了關(guān)鍵字static,聲明為靜態(tài)全局變量,這就限制了它的作用域只局限于文件file1.c中。即使file2.c中加上了對(duì)A的訪問(wèn)聲明,也不能將A的作用域擴(kuò)展到file2.c中,因此函數(shù)sub()無(wú)法訪問(wèn)全局變量A。

4.7.4寄存器變量(register)

一般情況下,程序運(yùn)行時(shí)各變量的值是存放在內(nèi)存中的,如要對(duì)某變量進(jìn)行訪問(wèn),由控制器將該變量的值從內(nèi)存讀入運(yùn)算器中進(jìn)行運(yùn)算。為了提高變量的存取速度,C語(yǔ)言允許將變量的值直接放在CPU的寄存器中,這樣由于無(wú)需到內(nèi)存中去訪問(wèn),存取速度就更快,這樣的變量就叫“寄存器變量”。C語(yǔ)言中提供了關(guān)鍵字register來(lái)聲明寄存器變量,聲明語(yǔ)句格式如下:

register類型名

變量表;

要注意的是:

1.只有局部變量和形式參數(shù)可以定義為寄存器變量,其它變量(如全局變量)不行;

2.由于CPU中的寄存器數(shù)量有限,不要定義過(guò)多的寄存器變量,多出的變量自動(dòng)作為自動(dòng)變量處理;

3.C語(yǔ)言中,寄存器變量?jī)H限于int、char和指針型。

#include<stdio.h>floatfac(intm){registerinti;floatf=1;for(i=1;i<=m;i++)f=f*i;return(f);}main(){inti;for(i=1;i<=10;i++)

printf(“\n%d!=%.0f”,i,fac(i));}

程序運(yùn)行結(jié)果:

1!=12!=23!=64!=245!=1206!=7207!=50408!=403209!=36288010!=3628800例4.23:該例說(shuō)明寄存器變量的作用

4.8內(nèi)部函數(shù)和外部函數(shù)

一個(gè)C語(yǔ)言程序在設(shè)計(jì)階段往往是由多個(gè)源文件構(gòu)成的,每個(gè)源文件都可以包含若干個(gè)函數(shù),實(shí)際上每個(gè)函數(shù)(除了主函數(shù)main())也有一個(gè)存儲(chǔ)類別的問(wèn)題。函數(shù)從存儲(chǔ)類別的角度劃分,可分為“內(nèi)部函數(shù)”和“外部函數(shù)”兩種。4.8.1內(nèi)部函數(shù)

所謂內(nèi)部函數(shù),是指只能被本文件中其它函數(shù)所調(diào)用的函數(shù),其它文件中的函數(shù)不能調(diào)用之。定義內(nèi)部函數(shù)要用到關(guān)鍵字static,形式如下:

static類型標(biāo)識(shí)符

函數(shù)名([<形式參數(shù)表>]) { …… }

內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。4.8.2外部函數(shù)

外部函數(shù)是指可供程序中所有文件調(diào)用的函數(shù)。定義外部函數(shù)要用到關(guān)鍵字extern,形式如下:

[extern]類型標(biāo)識(shí)符

函數(shù)名([<形式參數(shù)表>]) { …… }

實(shí)際上在定義外部函數(shù)時(shí),extern可省略。省略后,C語(yǔ)言默認(rèn)為外部函數(shù)。

將函數(shù)定義為外部函數(shù)是否就可以被其它文件訪問(wèn)了呢?還不行。因?yàn)楹瘮?shù)也有一個(gè)作用域問(wèn)題。

要想調(diào)用成功,還必須在其它文件中用函數(shù)原型對(duì)其進(jìn)行聲明。函數(shù)原型的完整形式為:

[extern]類型標(biāo)識(shí)符

函數(shù)名([<形式參數(shù)表>]);

與定義外部函數(shù)的格式差不多,只是要在后面加上一個(gè)分號(hào)“;”。在實(shí)際使用中,關(guān)鍵字extern可省略。

程序運(yùn)行結(jié)果:

s=5166

對(duì)上述建立的兩個(gè)文件,如何將它們編譯在一起,形成一個(gè)最終的exe文件而運(yùn)行呢?按照下面的步驟進(jìn)行即可:

1.在編輯狀態(tài)下建立一個(gè)“項(xiàng)目文件”,它不包含任何程序語(yǔ)句,只包括組成程序的所有源文件名。如本例創(chuàng)建的項(xiàng)目文件只包括下面兩個(gè)源文件:

file_1.c file_2.c

將以上建立的項(xiàng)目文件存盤(pán),主文件名自定,但擴(kuò)展名必須為

.prj

。假設(shè)本例所建的項(xiàng)目文件名為

exam.prj。

2.在TurboC主菜單中選擇Project菜單,按回車(chē)鍵后出現(xiàn)下拉菜單,選擇ProjectName菜單項(xiàng)并按回車(chē)鍵后,在彈出的對(duì)話框中輸入要選擇的項(xiàng)目文件名。本例中輸入exam.prj

,這樣做的目的,是為了選擇當(dāng)前要連接和編譯的項(xiàng)目,這時(shí),可看到Project菜單下的子菜單ProjectName中的名稱為exam.prj

,說(shuō)明它為當(dāng)前項(xiàng)目。如果要重新選擇一個(gè)項(xiàng)目,重復(fù)此步即可。

3.選擇好項(xiàng)目后,就可進(jìn)行編譯連接了。選擇主菜單中的Compile菜單項(xiàng),在其下拉菜單中選擇MakeEXEfile菜單項(xiàng),按回車(chē)鍵后,系統(tǒng)就能將exam.prj中指定的兩個(gè)源文件編譯連接成一個(gè)可執(zhí)行文件

exam.exe。也可直接按F9進(jìn)行編譯連接,最后按Ctrl+F9運(yùn)行程序exam.exe。4.9編譯預(yù)處理命令

在書(shū)中的眾多例子中,在程序的開(kāi)頭都有一個(gè)“#include<stdio.h>”的命令。這個(gè)命令就是一個(gè)“預(yù)處理命令”。什么叫預(yù)處理命令?它有什么作用呢?

預(yù)處理命令用來(lái)告訴編譯程序在對(duì)源程序進(jìn)行編譯之前應(yīng)作些什么。這些命令在行首以#開(kāi)頭,C中的預(yù)處理命令主要有三種:宏定義、文件包含、條件編譯。4.9.1宏定義

宏定義(#define)能有效地提高程序的編程效率,增強(qiáng)程序的可讀性、可修改性。C語(yǔ)言的宏定義分為“不帶參的宏定義”和“帶參的宏定義”兩種。

1.不帶參數(shù)的宏定義

格式:

#define宏名

宏體

作用:

為宏名指定宏體。在對(duì)源程序進(jìn)行預(yù)處理時(shí),將程序中出現(xiàn)宏名的地方均由宏體替換,這一過(guò)程也稱為“宏展開(kāi)”。

2.帶參數(shù)的宏定義

格式:

#define宏名(形參表)宏體

作用:

定義帶參數(shù)的宏。在對(duì)源程序進(jìn)行預(yù)處理時(shí),將程序中凡是出現(xiàn)宏名的地方均用宏體替換,并用實(shí)參代替宏體中的形參。例4.25:該例說(shuō)明如何在程序中使用宏定義

#include<stdio.h>#definePI3.1415926#defineR4#defineL2*PI*R#defineSPI*R*R#defineMSG“Thisisamacro-defineexample.\n”main(){

printf(MSG);

printf(“L=%f,S=%f\n”,L,S);}

程序運(yùn)行結(jié)果如下:

Thisisamacro-defineexample.L=25.132741,S=50.265482例4.26:該例說(shuō)明帶參數(shù)的宏定義在程序中的使用

#include<stdio.h>#definePI3.1415926#defineL(r)2*PI*rmain(){floatcircle,a;

printf(“\na=”);

scanf(“%f”,&a);circle=L(a);

printf(“\ncircle=%f”,circle);}

程序運(yùn)行結(jié)果如下:

a=2.5circle=15.7079634.9.2文件包含

C語(yǔ)言中提供了許多系統(tǒng)函數(shù)、宏定義、結(jié)構(gòu)體類型、全局變量等,它們的聲明都分門(mén)別類地放在不同的“頭文件”中(擴(kuò)展名為.h)。例如,程序中經(jīng)常要用到“printf()”、“scanf()”等一些輸入輸出庫(kù)函數(shù),而頭文件“stdio.h”中有這些輸入輸出函數(shù)的原型聲明,這樣,通過(guò)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論