函數(shù)省公開課一等獎全國示范課微課金獎_第1頁
函數(shù)省公開課一等獎全國示范課微課金獎_第2頁
函數(shù)省公開課一等獎全國示范課微課金獎_第3頁
函數(shù)省公開課一等獎全國示范課微課金獎_第4頁
函數(shù)省公開課一等獎全國示范課微課金獎_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章函數(shù)

C語言程序設(shè)計主編:冉崇善第1頁人們在求解一個復(fù)雜問題時,通常采取是化整為零、逐一處理方法,也就是把一個大問題分解成若干個比較輕易求解小問題,然后分別求解。程序員在設(shè)計一個復(fù)雜應(yīng)用程序時,往往也是把整個程序劃分為若干功效較為單一程序模塊,然后分別給予實現(xiàn),最終再把全部程序模塊像搭積木一樣裝配起來,這種在程序設(shè)計中逐一處理分而治之策略,被稱為模塊化程序設(shè)計方法。在C語言中,函數(shù)是程序基本組成單位(相當(dāng)于其它高級語言子程序),所以能夠很方便地用函數(shù)作為程序模塊來實現(xiàn)C語言程序。C語言不但提供了極為豐富庫函數(shù)(如Turbo

C、MS

C都提供了三百多個庫函數(shù)),還允許用戶建立自己定義函數(shù)。用戶可把自己算法編成一個個相對獨立函數(shù)模塊,然后用調(diào)用函數(shù)換算方法來使用函數(shù)。這不但能夠?qū)崿F(xiàn)程序模塊化,而且還能夠使程序?qū)哟谓Y(jié)構(gòu)清楚,便于程序編寫、閱讀、調(diào)試。第2頁5.1函數(shù)分類

5.1.1庫函數(shù)和用戶自定義函數(shù)從函數(shù)定義角度看,函數(shù)可分為庫函數(shù)和用戶自定義函數(shù)兩種。1.庫函數(shù)由C系統(tǒng)提供,用戶無須定義,也無須在程序中作類型說明,只需在程序前包含有該函數(shù)原型頭文件(即可在程序)中直接調(diào)用。在前面各章例題中重復(fù)用到printf、scanf、getchar、putchar、gets、puts、strcat等函數(shù)均屬這類。2.用戶自定義函數(shù)由用戶按需要自己編寫函數(shù),稱為用戶自定義函數(shù)。對于用戶自定義函數(shù),不但要在程序中定義函數(shù)本身,而且在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進行類型說明,然后才能使用。

第3頁

5.1.2有返回值函數(shù)和無返回值函數(shù)C語言函數(shù)兼有其它語言中函數(shù)和過程兩種功效,從這個角度看,可把函數(shù)分為有返回值和無返回值函數(shù)兩種。1.有返回值函數(shù)這類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個執(zhí)行結(jié)果,稱為函數(shù)返回值。如數(shù)學(xué)函數(shù)即屬于這類函數(shù)。由用戶定義要返回函數(shù)值函數(shù),必須在函數(shù)定義和函數(shù)說明中明確返回值類型。2.無返回值函數(shù)

這類函數(shù)用于完成某項特定處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值。這類函數(shù)類似于其它語言過程。因為函數(shù)無須返回值,用戶在定義這類函數(shù)時可指定它返回為“空類型”,空類型說明符為“void”。第4頁

5.1.3無參函數(shù)和有參函數(shù)從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送角度看函數(shù)可分為無參函數(shù)和有參函數(shù)兩種。1.無參函數(shù)函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)。主調(diào)函數(shù)和被調(diào)函數(shù)之間不進行參數(shù)傳遞。這類函數(shù)通慣用來完成一組指定功效,能夠返回或不返回函數(shù)值。2.有參函數(shù)有參函數(shù),也稱為帶參函數(shù)。在函數(shù)定義及函數(shù)說明時都有參數(shù),此時參數(shù)稱為形式參數(shù)(簡稱為形參)。在函數(shù)調(diào)用時也必須給出參數(shù),此時參數(shù)稱為實際參數(shù)(簡稱為實參)。進行函數(shù)調(diào)用時,主調(diào)函數(shù)將把實參值傳遞給形參,供被調(diào)函數(shù)使用。第5頁5.2函數(shù)定義函數(shù)(含主函數(shù))都是由函數(shù)說明和函數(shù)體兩部分組成。5.2.1無參函數(shù)定義普通形式函數(shù)類型函數(shù)名(void){

說明語句部分;可執(zhí)行語句部分;

}注意:在舊標準中,函數(shù)能夠缺省參數(shù)表。但在新標準中,除主函數(shù)main()外,函數(shù)不可缺省參數(shù)表,假如不需要參數(shù),則用“void”表示。

函數(shù)體函數(shù)說明第6頁5.2.2有參函數(shù)普通形式函數(shù)類型函數(shù)名(

數(shù)據(jù)類型參數(shù)1[,數(shù)據(jù)類型

參數(shù)2…]

)

{說明語句部分;可執(zhí)行語句部分;}形式參數(shù):將函數(shù)定義中參數(shù)表稱為形式參數(shù)表,簡稱形參表。與調(diào)用函數(shù)提供實際參數(shù)區(qū)分。

實際參數(shù):調(diào)用有參函數(shù)時,調(diào)用函數(shù)必須賦予這些參數(shù)實際值,調(diào)用函數(shù)中參數(shù)稱為實際參數(shù)。第7頁空函數(shù)其形式為:

[函數(shù)類型]函數(shù)名(void){}“空函數(shù)”既無參數(shù)、函數(shù)體為空函數(shù),什么操作也不做。其作用是在此處留一函數(shù)位置,方便未來擴充功效之用。函數(shù)名也在未來換取實際函數(shù)名。第8頁函數(shù)定義說明:⑴在C語言中,全部函數(shù)(包含主函數(shù)main())都是平行、獨立。

⑵在一個包含多個函數(shù)程序中,一個函數(shù)定義,能夠放在程序中任意位置,即能夠放在主函數(shù)main()之前或放在主函數(shù)main()之后。

⑶在一個函數(shù)函數(shù)體內(nèi),不能再定義另一個函數(shù),即函數(shù)不能嵌套定義。

⑷函數(shù)之間允許相互調(diào)用,以能夠嵌套調(diào)用。第9頁

例5.1在程序主函數(shù)中,執(zhí)行了3次調(diào)用無參函數(shù)s()語句。

#include<stdio.h>voidmain(){voids();/*函數(shù)調(diào)用說明*/inti=0,a=10;while(i<3){++a;printf(“%d,”,a++);s();i++;}}voids(void){intz=300;z++;printf(“%d\n”,z++);}函數(shù)調(diào)用運行結(jié)果:11,30113,30115,301定義函數(shù)無參數(shù)無返回值第10頁

例5.2定義一個函數(shù),用于求兩個數(shù)中大數(shù)。

main(){intmax(intx,inty);/*函數(shù)調(diào)用說明*/inta1,a2,a3;printf("inputtwonumbers:\n");scanf("%d%d",&a1,&a2);a3=max(a1,a2);printf("max=%d\n",a3);}intmax(intx,inty)

{intz;

z=x>y?x:y;return(z);

}帶參數(shù)用戶自定義函數(shù)第11頁

intmax(intx,inty)

{intz;

z=x>y?x:y;return(z);

}

在老版本C語言中,參數(shù)類型說明允許放在函數(shù)說明部分第2行單獨指定。

例: intmax(x,y) intx,y;

{intz;

z=x>y?x:y; return(z); }在新版本中寫成一行:

intmax(intx,inty)在老版本中寫成二行:

intmax(x,y)intx,y;第12頁5.2.3函數(shù)說明與返回值

當(dāng)一個函數(shù)沒有明確說明類型時,C語言編譯程序自動將整型(int)作為該函數(shù)默認類型,默認類型適合用于很大一部分函數(shù)。當(dāng)有必要返回其它類型數(shù)據(jù)時,需要分兩步處理。(1)必須給函數(shù)以明確類型說明符;(2)函數(shù)類型說明必須處于對它首次調(diào)用之前。只有這么,C編譯程序才能為返回非整型值函數(shù)生成正確代碼。

1.函數(shù)類型說明可將函數(shù)說明為返回任何一個正當(dāng)C語言數(shù)據(jù)類型。類型說明符告訴編譯程序它返回什么類型數(shù)據(jù)。這個信息對于程序能否正確運行關(guān)系極大,因為不一樣數(shù)據(jù)有不一樣長度和內(nèi)部表示。第13頁

返回非整型數(shù)據(jù)函數(shù)被使用之前,必須把它類型向程序其余部分說明。若不這么做,C語言編譯程序就認為函數(shù)是返回整型數(shù)據(jù)函數(shù),假如調(diào)用點又在函數(shù)類型說明之前,編譯程序就會對調(diào)用生成錯誤代碼。為了預(yù)防上述問題出現(xiàn),必須使用一個尤其說明語句。對被調(diào)函數(shù)說明有兩種格式,一個為傳統(tǒng)格式,一個為當(dāng)代格式。(1)傳統(tǒng)格式普通格式為:

類型說明符被調(diào)函數(shù)名();

這種格式只給出函數(shù)返回值類型,被調(diào)函數(shù)名及一個空括號。因為在括號中沒有任何參數(shù)信息,所以不便于編譯系統(tǒng)進行錯誤檢驗,易犯錯。(2)當(dāng)代格式普通形式為:

類型說明符

被調(diào)函數(shù)名(類型

形參,類型形參…);或類型說明符

被調(diào)函數(shù)名(類型,類型…);

當(dāng)代格式括號內(nèi)給出了形參類型和形參名,或只給出形參類型。這便于編譯系統(tǒng)進行檢錯,以預(yù)防可能出現(xiàn)錯誤。第14頁

例5.3main函數(shù)中對max函數(shù)說明若用傳統(tǒng)格式可寫為:

int

max();

用當(dāng)代格式可寫為:

int

max(int

a,int

b);

或?qū)憺椋篿nt

max(int,int);

C語言中又要求在以下幾個情況時能夠省去主調(diào)函數(shù)中對被調(diào)函數(shù)函數(shù)說明。

(1)假如被調(diào)函數(shù)返回值是整型或字符型時,能夠不對被調(diào)函數(shù)作說明,而直接調(diào)用。這時系統(tǒng)將自動對被調(diào)函數(shù)返回值按整型處理。(2)當(dāng)被調(diào)函數(shù)函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,

在主調(diào)函數(shù)中也能夠不對被調(diào)函數(shù)再作說明而直接調(diào)用。比如,例5-1中,

函數(shù)max定義放在main

函數(shù)之前,所以可在main函數(shù)中省去對max函數(shù)函數(shù)說明int

max(int

a,int

b)。

(3)如在全部函數(shù)定義之前,在函數(shù)外預(yù)先說明了各個函數(shù)類型,則在以后各主調(diào)函數(shù)中,可不再對被調(diào)函數(shù)作說明。比如:

第15頁char

str(int

a);

float

f(float

b);

main()

{

…}

char

str(int

a)

{…}

float

f(float

b)

{…}

其中第1、2行對str函數(shù)和f函數(shù)預(yù)先作了說明。

所以在以后各函數(shù)中無須對str和f函數(shù)再作說明就可直接調(diào)用。

第16頁(4)對庫函數(shù)調(diào)用不需要再作說明,

但必須把該函數(shù)頭文件用include命令包含在源文件前部。數(shù)組作為函數(shù)參數(shù)數(shù)組能夠作為函數(shù)參數(shù)使用,進行數(shù)據(jù)傳送。

數(shù)組用做函數(shù)參數(shù)有兩種形式,一個是把數(shù)組元素(下標變量)作為實參使用;

另一個是把數(shù)組名作為函數(shù)形參和實參使用。數(shù)組元素作函數(shù)實參時數(shù)組元素就是下標變量,它與普通變量并無區(qū)分。所以它作為函數(shù)實參使用與普通變量是完全相同,在發(fā)生函數(shù)調(diào)用時,把作為實參數(shù)組元素值傳送給形參,實現(xiàn)單向值傳送。第17頁

2.函數(shù)返回值C語言函數(shù)從有沒有返回值這個角度考慮,可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。有參函數(shù)返回值,是經(jīng)過函數(shù)中return語句來取得。(1)返回語句格式:

return(表示式);(2)return語句功效:返回調(diào)用函數(shù),并將“表示式”值帶給調(diào)用函數(shù)。

(3)

return語句返回值類型應(yīng)與該函數(shù)類型一致。不然以函數(shù)類型為準。

第18頁

(4)

return語句后面能夠是變量,也能夠是表示式。

如:

return(x>y?x:y);

(5)

return語句后面能夠有括號,也能夠沒有。如:

returnz

;

return(z);

(6)

函數(shù)返回值是經(jīng)過return語句取得。當(dāng)不需返回函數(shù)值時,可省去return語句。

調(diào)用函數(shù)中無return語句,并不是不返回一個值,而是一個不確定值。為了明確表示不返回值,能夠用“void”定義成“無(空)類型”。第19頁

若函數(shù)中沒有return語句,則該函數(shù)被調(diào)用后也會帶回不確定值。如在執(zhí)行以下函數(shù)體語句:

{inta,b,c;a=printstar();b=print_message();c=printstar();printf(“%d,%d,%d\n”,a,b,c);

}

輸出a,b,c值將是各個被處理字符串長度。

為了明確表示不需要函數(shù)返回值,能夠用“void”定義函數(shù)為“無類型”。此時,不得使用a=printstar()之類語句。3個被調(diào)函數(shù)中均沒有return語句

第20頁例5.4主函數(shù)分別調(diào)用空類型函數(shù)fu1和返回整型值fu2函數(shù)。程序以下:#include<stdio.h>main(){intfu1(inta,intb),fu2(inta,intb);inta,b;printf("inputtwonumbers:\n");scanf(“%d%d”,&a,&b);

fu1(a,b);

printf(“(a+b)*(a+b)=%d\n”,

fu2(a,b));}

第21頁

voidfu1(intx,inty){intz1;z1=x*x+y*y;printf("x*x+y*y=%d\n",z1);}intfu2(intx,inty){intz2;z2=(x+y)*(x+y);

return(z2);}

其中fu1(),fu2()兩個函數(shù)為用戶自己定義函數(shù),需要用戶指定函數(shù)名及函數(shù)體內(nèi)語句。無返回值函數(shù)返回值函數(shù)第22頁5.3函數(shù)作用域規(guī)則“語言作用域規(guī)則”是一組確定一部分代碼是否“可見”或可訪問另一部分代碼和數(shù)據(jù)規(guī)則。C語言中每一個函數(shù)都是一個獨立代碼塊。一個函數(shù)代碼塊是隱藏于函數(shù)內(nèi)部,不能被任何其它函數(shù)中任何語句(除調(diào)用它語句之外)所訪問(比如,用goto語句跳轉(zhuǎn)到另一個函數(shù)內(nèi)部是不可能)。組成一個函數(shù)體代碼對程序其它部分來說是隱蔽,它既不能影響程序其它部分,也不受其它部分影響。換言之,因為兩個函數(shù)有不一樣作用域,定義在一個函數(shù)內(nèi)部代碼和數(shù)據(jù)無法與定義在另一個函數(shù)內(nèi)部代碼和數(shù)據(jù)相互作用。C語言中全部函數(shù)都處于同一作用域級別上。這就是說,把一個函數(shù)定義于另一個函數(shù)內(nèi)部是不可能。第23頁

5.3.1局部變量在函數(shù)內(nèi)部定義變量稱為局部變量。在一些C語言教材中,局部變量又稱為自動變量,這就與使用可選關(guān)鍵字auto定義局部變量這一作法保持一致。局部變量僅由其被定義模塊內(nèi)部語句所訪問。換言之,局部變量在自己代碼模塊之外是不可知。注意:模塊以左大括號開始,以右大括號結(jié)束。對于局部變量,最主要是它們僅存在于被定義當(dāng)前執(zhí)行代碼塊中,即局部變量在進入模塊時生成,在退出模塊時消亡。定義局部變量最常見代碼塊是函數(shù)。比如,考慮例5-7中兩個函數(shù)。例5.5局部變量示例。第24頁func1(){

intx; /*可定義為autointx;*/

x=10;}func2(){

intx; /*可定義為autointx;*/

x=-1999;}說明整數(shù)變量x被定義了兩次,一次是在func1()中,一次是在func2()中。func1()和func2()中x互不相關(guān)。其原因是每個x作為局部變量僅在被定義函數(shù)塊內(nèi)可知。C語言中包含了關(guān)鍵字auto,它可用于定義局部變量。但自從全部非全局變量默認值假定為auto以來,auto就幾乎極少使用了,所以在本教材全部示例中,均見不到這一關(guān)鍵字。第25頁在每一函數(shù)模塊內(nèi)開始處定義全部需要變量,是最常見作法。這么做使得任何人讀此函數(shù)時都很輕易,首先了解用到變量。但并非得這么做不可,因為局部變量能夠在任何模塊中定義。為了解其工作原理,請看例5-8中函數(shù)。例5.6局部變量示例。f(){

intt;

scanf("%d",&t);

if(t==1){

chars[80];/*此變量僅在這個塊(復(fù)合語句)中起作用*/

printf("entername:");

gets(s); /*輸入字符串*/

process(s); /*函數(shù)調(diào)用*/

}}第26頁這里局部數(shù)組變量s就是在if塊(復(fù)合語句)入口處建立,并在其出口處消亡。所以數(shù)組s僅在if塊中可知,而在其它地方均不可訪問,甚至在包含它f函數(shù)內(nèi)部其它部分也不行。在一個條件塊內(nèi)定義局部變量主要優(yōu)點是僅在需要時才為之分配內(nèi)存。這是因為局部變量僅在控制轉(zhuǎn)到它們被定義塊內(nèi)時才進入生存期。即使大多數(shù)情況下這并不十分主要,但當(dāng)代碼用于專用控制器(如識別數(shù)字安全碼車庫門控制器)時,這就變得十分主要了,因為這時隨機存放器(RAM)極其短缺。因為局部變量伴隨它們被定義模塊進出口而建立或釋放,它們存放信息在塊工作結(jié)束后也就丟失了。切記,這點對相關(guān)函數(shù)訪問尤其主要。當(dāng)訪問一函數(shù)時,它局部變量被建立,當(dāng)函數(shù)返回時,局部變量被銷毀。這就是說,局部變量值不能在兩次調(diào)用之間保持。第27頁

5.3.2全局變量

與局部變量不一樣,全局變量貫通整個程序,而且可被任何一個模塊使用。它們在整個程序執(zhí)行期間保持有效。全局變量定義在全部函數(shù)之外,可由函數(shù)內(nèi)任何表示式訪問。在例5-9程序中能夠看到,變量count定義在全部函數(shù)之外,函數(shù)main()之前。但其實它能夠放置在任何第一次被使用之前地方,只要不在函數(shù)內(nèi)就能夠。實踐表明,定義全局變量最正確位置是在程序頂部,也就是main()函數(shù)和其它子函數(shù)定義之前。例5.7全局變量示例。#include<stdio.h>intcount; /*定義count是全局變量*/main(){count=100;

func1(); /*調(diào)用無參函數(shù)func1*/}第28頁func1() /*定義函數(shù)*/{

inttemp;

temp=count;

func2(); /*調(diào)用無參函數(shù)func2*/

printf("countis%d",count); /*打印100*/}func2() /*定義函數(shù)*/{

intcount;

for(count=1;count<10;count++)

putchar('.'); /*打印出"."*/}第29頁全局變量由C編譯程序在動態(tài)區(qū)之外固定存放區(qū)域中存放。當(dāng)程序中多個函數(shù)都使用同一數(shù)據(jù)時,全局變量將是很有效。然而,因為三種原因,應(yīng)防止使用無須要全局變量:(1)不論是否需要,它們在整個程序執(zhí)行期間均占用存放空間。(2)因為全局變量必須依靠外部定義,所以在使用局部變量就能夠到達其功效時使用了全局變量,將降低函數(shù)通用性,這是因為它要依賴其本身之外東西。(3)大量使用全局變量時,不可知和不需要副作用將可能造成程序錯誤。如在編寫大型程序時有一個主要問題是:變量值都有可能在程序其它地點偶然改變。第30頁

5.3.3動態(tài)存放變量從變量作用域標準出發(fā),能夠?qū)⒆兞糠譃槿肿兞亢途植孔兞?;從變量生存期來分,可將變量分為動態(tài)存放變量及靜態(tài)存放變量。動態(tài)存放變量能夠是函數(shù)形式參數(shù)、局部變量、函數(shù)調(diào)用時現(xiàn)場保護和返回地址。這些動態(tài)存放變量在函數(shù)調(diào)用時分配存放空間,函數(shù)結(jié)束時釋放存放空間。動態(tài)存放變量定義形式為在變量定義前面加上關(guān)鍵字“auto”,比如:autointa,b,c;“auto”也能夠省略不寫。實際上,我們已經(jīng)使用變量均為省略了關(guān)鍵字“auto”動態(tài)存放變量。有時我們甚至為了提升速度,將局部動態(tài)存放變量定義為存放器型變量,定義形式為在變量前面加關(guān)鍵字“register”,比如:registerintx,y,z;這么一來好處是:將變量值無需存入內(nèi)存,而只需保留在CPU內(nèi)存放器中,以使速度大大提升。

第31頁5.3.4靜態(tài)存放變量在編譯時分配存放空間變量稱為靜態(tài)存放變量,其定義形式為在變量定義前面加上關(guān)鍵字“static”,比如:staticinta=8;定義靜態(tài)存放變量不論是做全局變量或是局部變量,其定義和初始化都在程序編譯時進行。作為局部變量,調(diào)用函數(shù)結(jié)束時,靜態(tài)存放變量不消失而且保留原值。

例5.8靜態(tài)變量示例。#include<stdio.h>main(){

intf();

intj; /*函數(shù)申明*/

for(j=0;j<3;j++)

printf("%d\n",f());}第32頁intf() /*無參函數(shù)*/{

staticintx=1;

x++;

returnx;}運行程序:234說明:從上述程序看,函數(shù)f()被三次調(diào)用,因為局部變量x是靜態(tài)存放變量,它是在編譯時分配存放空間,故每次調(diào)用函數(shù)f()時,變量x不再重新初始化,保留加1后值,得到以上輸出。第33頁5.4函數(shù)參數(shù)與調(diào)用5.4.1形式參數(shù)與實際參數(shù)函數(shù)參數(shù)分為形參和實參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都能夠使用,離開該函數(shù)則不能使用。形參定義是在函數(shù)名之后括號中或函數(shù)頭之后大括號之前。實參出現(xiàn)在主調(diào)函數(shù)中,進入被調(diào)函數(shù)后,實參變量也不能使用。

形參和實參功效是作數(shù)據(jù)傳送。在函數(shù)調(diào)用時,主調(diào)函數(shù)把實參值傳送給被調(diào)函數(shù)形參從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)數(shù)據(jù)傳送。

函數(shù)形參和實參含有以下特點:

(1)形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配內(nèi)存單元。所以,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。

第34頁

(2)實參能夠是常量、變量、表示式、函數(shù)等,

不論實參是何種類型量,在進行函數(shù)調(diào)用時,它們都必須含有確定值,

方便把這些值傳送給形參。所以應(yīng)預(yù)先用賦值、輸入等方法使實參取得確定值。

(3)實參和形參在數(shù)量上、類型上、次序上應(yīng)嚴格一致,不然會發(fā)生“類型不匹配”錯誤。(4)函數(shù)調(diào)用中發(fā)生數(shù)據(jù)傳送是單向。即只能把實參值傳送給形參,而不能把形參值反向地傳送給實參。所以在函數(shù)調(diào)用過程中,形參值發(fā)生改變,而實參中值不會改變。例5-11能夠說明這個問題。例5.9函數(shù)調(diào)用示例。#include<stdio.h>main()

{int

n;

printf("input

number:\n");

scanf("%d",&n);

s(n);

printf("n=%d\n",n);

}

第35頁

int

s(int

n)

{

int

i;

for(i=n-1;i>=1;i--)

n=n+i;

printf("n=%d\n",n);

}

輸入:input

number:100輸出:n=5050 /*形參值*/n=100 /*實參值*/

說明:本程序中定義了一個函數(shù)s,該函數(shù)功效是求1+2+3+…+100值。在主函數(shù)中輸入n值,并作為實參,在調(diào)用時傳送給函數(shù)s形參變量n(注意,本例形參變量和實參變量標識符都為n,但這是兩個不一樣量,各自作用域不一樣)。在主函數(shù)中用printf

語句輸出一次n值,這個n值是實參n值。在函數(shù)s中也用printf

語句輸出了一次n值,這個n值是形參最終取得n值。從運行情況看,輸入n值為100。即實參n值為100。把此值傳給函數(shù)s時,形參n初值也為100,在執(zhí)行函數(shù)過程中,形參n值變?yōu)?050。返回主函數(shù)之后,輸出實參n值仍為100??梢妼崊⒅挡浑S形參改變而改變。第36頁5.4.2賦值調(diào)用與引用調(diào)用1.賦值調(diào)用普通說來,有兩種方法能夠把參數(shù)傳遞給函數(shù)。第一個叫做“賦值調(diào)用”(callbyvalue),這種方法是把參數(shù)值復(fù)制到函數(shù)形式參數(shù)中。這么,函數(shù)中形式參數(shù)任何改變都不會影響到調(diào)用時所使用變量。傳值流程如圖5-1所表示。

圖5-1賦值調(diào)用流程第37頁2.引用調(diào)用把參數(shù)傳遞給函數(shù)第二種方法是“引用調(diào)用”(callbyreference)。這種方法是把參數(shù)地址復(fù)制給形式參數(shù),在函數(shù)中,這個地址用來訪問調(diào)用中所使用實際參數(shù)。這意味著,形式參數(shù)改變會影響調(diào)用時所使用那個變量。傳址流程如圖5-2所表示。圖5-2引用調(diào)用流程除少數(shù)情況外,C語言使用賦值調(diào)用來傳遞參數(shù)。這意味著,普通不能改變調(diào)用時所用變量值。請看例5-12。第38頁例5.10引用調(diào)用示例。#include<stdio.h>main(){

intt=10;

printf("%d%d",sqr(t),t); /*調(diào)用函數(shù)sqr(t),t是實參*/}intsqr(x) /*定義函數(shù),x是形式參數(shù)*/intx; /*定義形式參數(shù)x是整形*/{x=x*x;

return(x); /*將x值作為sqr函數(shù)返回值傳給主調(diào)函數(shù)*/}說明:在這個例子里,傳遞給函數(shù)sqr()參數(shù)值是復(fù)制給形式參數(shù)x,當(dāng)賦值語句x=x*x執(zhí)行時,僅修改局部變量x值。用于調(diào)用sqr()變量t,依然保持著值10。執(zhí)行程序:10010注意:傳給函數(shù)只是參數(shù)值復(fù)制品。全部發(fā)生在函數(shù)內(nèi)部改變均無法影響調(diào)用時使用變量。第39頁5.4.3函數(shù)調(diào)用形式

C程序經(jīng)過對函數(shù)調(diào)用來執(zhí)行函數(shù)體。

1、函數(shù)調(diào)用方式(1)表示式語句調(diào)用函數(shù)。被調(diào)函數(shù)作為表示式一項,出現(xiàn)在表示式中,以函數(shù)返回值參加表示式運算。這種方式要求函數(shù)是有返回值。比如:

a=b+fun(x,y);第40頁(2)函數(shù)語句被調(diào)函數(shù)能夠只進行一些操作而不返回函數(shù)值,這時函數(shù)調(diào)用可作為一條獨立語句。比如:

funa();(3)函數(shù)實參被調(diào)函數(shù)作為另一個函數(shù)調(diào)用實際參數(shù)出現(xiàn)。即把該函數(shù)返回值作為實參進行傳送,所以要求該函數(shù)必須是有返回值。比如:

printf(“%d\n”,max(a,b));第41頁2.調(diào)用函數(shù)說明(1)調(diào)用函數(shù)時,函數(shù)名稱必須與含有該功效自定義函數(shù)名稱完全一致。(2)實參在類型上按次序與形參,必須一一對應(yīng)和匹配。假如類型不匹配,C編譯程序?qū)促x值兼容規(guī)則進行轉(zhuǎn)換。假如實參和形參類型不賦值兼容,通常并不給出犯錯信息,且程序依然繼續(xù)執(zhí)行,只是得不到正確結(jié)果。(3)假如實參表中包含多個參數(shù),對實參求值次序隨系統(tǒng)而異。有系統(tǒng)按自左向右次序求實參值,有系統(tǒng)則相反。TurboC和MSC是按自右向左次序進行。第42頁

例5.11函數(shù)調(diào)用方式示例程序。#include<stdio.h>#include<math.h>main(){intfu1(inta,intb),fu2(inta,intb);inta,b,x1;printf("inputtwonumbers:\n");

scanf(“%d%d”,&a,&b);fu1(a,b);

/*調(diào)用求兩數(shù)平方和函數(shù)*/printf(“(a+b)*(a+b)=%d\n”,

fu2(a,b));

x1=

sqrt(a+b);

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

}

函數(shù)調(diào)用說明表示式語句函數(shù)調(diào)用作為函數(shù)實參被調(diào)用函數(shù)語句調(diào)用函數(shù)語句調(diào)用函數(shù)語句調(diào)用第43頁3.函數(shù)類型在定義函數(shù)時,對函數(shù)類型說明,應(yīng)與return語句中返回值表示式類型一致。假如不一致,則以函數(shù)類型為準。假如缺省函數(shù)類型,則系統(tǒng)一律按整型處理。良好程序設(shè)計習(xí)慣:為了使程序含有良好可讀性并降低犯錯,凡不要求返回值函數(shù)都應(yīng)定義為空類型;即使函數(shù)類型為整型,也不使用系統(tǒng)缺省處理。第44頁例5.12intf

(inta,intb);{intc;if(a>b)c=1;elseif(a=

=b)c=0;elsec=–1;return(c);}main(){inti=2,p;p=

f

(i,++i);

printf

(“%d”,p);}輸出結(jié)果:0

注意:這里是按自右至左求值,相當(dāng)于fun(3,3)。

3b3a函數(shù)類型為int第45頁

4.對被調(diào)用函數(shù)說明ANSIC對被調(diào)用函數(shù)進行說明,其普通格式以下:函數(shù)類型函數(shù)名(形參表);

以下2種情況下,能夠省去對被調(diào)用函數(shù)說明:(1)當(dāng)被調(diào)用函數(shù)函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之前時。因為在調(diào)用之前,編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)函數(shù)類型、參數(shù)個數(shù)、類型和次序。(2)假如在全部函數(shù)定義之前,在函數(shù)外部(比如文件開始處)預(yù)先對各個函數(shù)進行了說明。第46頁例5.13main(){intf

(inta,intb);inti=2,p;p=f

(i,++i);printf

(“%d”,p);}intf

(inta,intb){intc;if(a>b)c=1;elseif(a=

=b)c=0;elsec=–1;return(c);}輸出結(jié)果:0被調(diào)用函數(shù)函數(shù)定義出現(xiàn)在調(diào)用函數(shù)之后,對被調(diào)用函數(shù)進行說明第47頁5.4.4函數(shù)值

函數(shù)值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中程序段所取得并返回給主調(diào)函數(shù)值。如調(diào)用正弦函數(shù)取得正弦值,調(diào)用例5-1max函數(shù)取得最大數(shù)等。對函數(shù)值(或稱函數(shù)返回值)有以下一些說明:

(1)函數(shù)值只能經(jīng)過return語句返回主調(diào)函數(shù)。return

語句普通形式為:

return

表示式;

或者為:

return

(表示式);

該語句功效是計算表示式值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個return語句,但每次調(diào)用只能有一個return

語句被執(zhí)行,

所以只能返回一個函數(shù)值。

(2)函數(shù)值類型和函數(shù)定義中函數(shù)類型應(yīng)保持一致。

假如二者不一致,則以函數(shù)類型為準,自動進行類型轉(zhuǎn)換。第48頁(3)如函數(shù)值為整型,在函數(shù)定義時能夠省去類型說明。(4)不返回函數(shù)值函數(shù),能夠明確定義為“空類型”,

類型說明符為“void”。如函數(shù)s并不向主函數(shù)返回函數(shù)值時,可定義為:void

s(int

n)

{……}

一旦函數(shù)被定義為空類型后,就不能在主調(diào)函數(shù)中使用被調(diào)函數(shù)函數(shù)值了。比如,在定義s為空類型后,在主函數(shù)中寫下述語句sum=s(n);

就是錯誤。為了使程序有良好可讀性并降低犯錯,凡不要求返回值函數(shù)都應(yīng)定義為空類型。函數(shù)說明在主調(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對該被調(diào)函數(shù)進行說明,這與使用變量之前要先進行變量說明是一樣。在主調(diào)函數(shù)中對被調(diào)函數(shù)作說明目標是使編譯系統(tǒng)知道被調(diào)函數(shù)返回值類型,方便在主調(diào)函數(shù)中按此種類型對返回值作對應(yīng)處理。

第49頁5.4.5數(shù)組作為函數(shù)參數(shù)使用時與普通變量一樣值傳遞方式在函數(shù)調(diào)用時將值傳遞給實參形參

1.數(shù)組元素作函數(shù)參數(shù)第50頁例5.14一個數(shù)組中有10個整型元素,求數(shù)組中全部素數(shù)之和。#include"stdio.h"#include"math.h"main(){inta[10],i,sum=0;intprime(intx);

printf("enter10numbers:\n");for(i=0;i<10;i++){scanf("%d",&a[i]);if(prime(a[i]))sum+=a[i];}printf("sum=%d\n",sum);}intprime(intx){intf=1,k;if(x==1)f=0;for(k=2;k<=sqrt(x);k++)if(x%k==0){f=0;break;}return(f);}第51頁地址傳遞方式,實參加形參共地址,相當(dāng)于對同一對象兩個不一樣名字。

2.數(shù)組名作為函數(shù)參數(shù)在函數(shù)調(diào)用時將其地址值傳遞給實參形參第七章7.4數(shù)組與函數(shù)第52頁#include"stdio.h"intf(intb[],intm,intn){inti,s=0;for(i=m;i<n;i=i+2)s=s+b[i];returns;}main(){intx,a[]={1,2,3,4,5,6,7,8,9};x=f(a,3,7);printf("%d\n",x);}

例5.14分析下面程序運行結(jié)果。

第53頁5.4.7函數(shù)嵌套調(diào)用函數(shù)嵌套調(diào)用:在一個函數(shù)函數(shù)體內(nèi)調(diào)用另一個函數(shù)。scanf()x()printf()y()getchar()max()第54頁main()

a()

b()調(diào)用a()調(diào)用b()

END調(diào)用一個函數(shù)過程中又調(diào)用了另一個函數(shù)在函數(shù)嵌套調(diào)用中,函數(shù)執(zhí)行采取后調(diào)用先返回標準。即最內(nèi)層函數(shù)調(diào)用最先返回函數(shù)值,由內(nèi)到外依次返回。第55頁例5.15輸入年月日,計算出該日為該年第幾天。

主控模塊判斷閏年求某月天數(shù)輸出輸入求總天數(shù)

第56頁程序?qū)崿F(xiàn):(1)判斷閏年。intleap(intyear){intlp;lp=(year%4==0&&year%100!=0||year%400==0)?1:0;returnlp;}第57頁(2)求某月天數(shù)。intmonth_days(intyear,intmonth){intds,d;switch(month){case1:case3:case5:case7:case8:case10:case12:d=31;break;case2:d=leap(year)?29:28;break;default:d=30;}returnd;}第58頁(3)求天數(shù)和。intdays(intyear,intmonth,intday){inti,ds=0;for(i=1;i<month;i++)ds=ds+month_days(year,i);ds=ds+day;returnds;}第59頁4)在主函數(shù)中分別調(diào)用三個函數(shù)。voidmain(){intyear,month,day,t_day;printf("Inputyear-month-day:\n");scanf("%d-%d-%d",&year,&month,&day);t_day=days(year,month,day);printf("%d-%d-%dis%dthdayoftheyear!\n",year,month,day,t_day);}

注意: 在完整程序中,前三個函數(shù)應(yīng)放在main()函數(shù)之前。第60頁例5.16求解x3-5x2+16x-80=0根算法。解題步驟:1.取兩個不一樣點x1,x2

假如f(x1)和f(x2)符號相反,則[x1,x2]區(qū)間必有一個根,假如同號,則應(yīng)改變x1和x2,直至異號為止2.連接f(x1)和f(x2),交x軸于x點,則x=[x1*f(x2)-x2*f(x1)]/[f(x2)-f(x1)]3.求f(x)4.若f(x)與f(x1)同號,則(x,x2)有根,此時將x作為x1若f(x)與f(x2)同號,則(x,x1)有根,此時將x作為x25.重復(fù)2~4步驟,直至f(x)<某個值,視精度要求而定x1f(x1)xx2f(x2)f(x)第61頁例5.17函數(shù)調(diào)用#include<math.h>floatroot(x1,x2)floatx1,x2;{inti;floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0001);return(x);}floatxpoint(x1,x2)floatx1,x2;{floaty;y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(y);}第62頁/*1.從以上函數(shù)可知,全部函數(shù)均是獨立*//*2.全部函數(shù)均設(shè)為"float"*//*3.全部函數(shù)均在main()之前定義*/main(){floatx1,x2,f1,f2,x;do{printf("inputx1,x2:\n");scanf("%f,%f",&x1,&x2);

f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("Arootofequationis%8.4f",x);}floatf(floatx){floaty;y=((x-5.0)*x+16)*x-80;return(y);}第63頁5.5函數(shù)遞歸調(diào)用

5.5.1遞歸調(diào)用遞歸調(diào)用:一個函數(shù)函數(shù)體直接或間接調(diào)用該函數(shù)本身.

intf(intx){inty,z;┆z=f(z);/*直接調(diào)用該函數(shù)本身*/┆return(2*z);}第64頁例5.18用遞歸法計算n!。分析:計算n!可用下述公式表示:1!=1遞歸條件所以,要想計算出n!,必須計算出(n-1)!;計算出(n-1)!,必須計算出(n-2)!;…;依這類推,直到推到1!=1,返回后即可依次計算出2!,3!,…,(n-1)!,n!。比如,計算4!,其遞歸過程是:

第65頁程序以下:longff(intn) /*求階乘函數(shù)*/{longf;if(n<0)printf("n<0,inputerror");elseif(n==0||n==1)f=1;elsef=ff(n-1)*n;return(f);}第66頁main(){intn;longy;printf("\ninputainteagernumber:n");

scanf("%d",&n);y=ff(n);printf("%d!=%ld",n,y);}說明:程序中給出函數(shù)ff是一個遞歸函數(shù)。主函數(shù)調(diào)用ff后即可進入函數(shù)ff執(zhí)行,假如形參n<0,n==0或n==1時都將結(jié)束函數(shù)執(zhí)行,不然就遞歸調(diào)用ff函數(shù)本身。因為每次遞歸調(diào)用實參為n-1,即把n-1值賦予形參n,最終當(dāng)n-1值為1時再作遞歸調(diào)用,形參n值也為1,將使遞歸終止。然后可逐層退回。第67頁下面再舉例說明該過程。設(shè)執(zhí)行本程序時輸入為4,即求4!。在主函數(shù)中調(diào)用語句即為y=ff(4),進入ff函數(shù)后,因為n=4,不等于0或1,故應(yīng)執(zhí)行f=ff(n-1)*n,(即f=ff(4-1)*4)。該語句對ff作遞歸調(diào)用(即ff(4))。進行三次遞歸調(diào)用后,ff函數(shù)形參取得值變?yōu)?,故不再繼續(xù)遞歸調(diào)用而開始逐層返回主調(diào)函數(shù)。ff(1)函數(shù)返回值為1,ff(2)返回值為1*2=2,ff(3)返回值為2*3=6,最終返回值為6*4=24。第68頁5.5.2遞歸說明(1)當(dāng)函數(shù)調(diào)用自己時,在棧中為新局部變量和參數(shù)分配內(nèi)存,函數(shù)代碼用這些變量和參數(shù)重新運行。遞歸調(diào)用并不是把函數(shù)代碼重新復(fù)制一遍,僅僅參數(shù)是新。當(dāng)每次遞歸調(diào)用返回時,老局部變量和參數(shù)就從棧中消除,從函數(shù)內(nèi)此次函數(shù)調(diào)用點重新開啟運行。可遞歸函數(shù)被說成是對本身“推入和拉出”。(2)遞歸調(diào)用層次越多,同名變量占用存放單元也就越多。一定要記住,每次函數(shù)調(diào)用,系統(tǒng)都會為該函數(shù)變量開辟新內(nèi)存空間。(3)當(dāng)此次調(diào)用函數(shù)運行結(jié)束時,系統(tǒng)將釋放此次調(diào)用時所占用內(nèi)存空間。程序流程返回到上一層調(diào)用點,同時取得當(dāng)初進入該層時,函數(shù)中變量和形參所占用內(nèi)存空間數(shù)據(jù)。第69頁(4)全部遞歸問題都能夠用非遞歸方法來處理,但對于一些比較復(fù)雜遞歸問題用非遞歸方法往往使程序變得十分復(fù)雜難以讀懂,而函數(shù)遞歸調(diào)用在處理這類問題時能使程序簡練明了有很好可讀性;但因為遞歸調(diào)用過程中,系統(tǒng)要為每一層調(diào)用中變量開辟內(nèi)存空間、要記住每一層調(diào)用后返回點、要增加許多額外開銷,所以函數(shù)遞歸調(diào)用通常會降低程序運行效率。(5)大部分遞歸例程沒有顯著地降低代碼規(guī)模和節(jié)約內(nèi)存空間。另外,大部分例程遞歸形式比非遞歸形式運行速度要慢一些。這是因為附加函數(shù)調(diào)用增加了時間開銷(在許多情況下,速度差異不太顯著)。對函數(shù)屢次遞歸調(diào)用可能造成堆棧溢出。不過溢出可能性不大,因為函數(shù)參數(shù)和局部變量是存放在堆棧中。每次新調(diào)用就會產(chǎn)生一些變量復(fù)制品。這個堆棧沖掉其它數(shù)據(jù)和程序存放區(qū)域可能性是存在。不過除非遞歸程序運行失控,不然無須為上述情況擔(dān)心。第70頁(6)遞歸函數(shù)主要優(yōu)點是能夠把算法寫比使用非遞歸函數(shù)時更清楚更簡練,而且一些問題,尤其是與人工智能相關(guān)問題,更適宜用遞歸方法。遞歸另一個優(yōu)點是,遞歸函數(shù)不會受到懷疑,較非遞歸函數(shù)而言,一些人更相信遞歸函數(shù)。編寫遞歸函數(shù)時,必須在函數(shù)一些地方使用if語句,強迫函數(shù)在未執(zhí)行遞歸調(diào)用前返回。假如不這么做,在調(diào)用函數(shù)后,它永遠不會返回。在遞歸函數(shù)中不使用if語句,是一個很常見錯誤。在開發(fā)過程中廣泛使用printf()和getchar()能夠看到執(zhí)行過程,而且能夠在發(fā)覺錯誤后停頓運行。第71頁有五個人坐在一起,求第5個人多少歲。第5個人多少歲?比第4個人大2歲。第4個人多少歲?比第3個人大2歲。第3個人多少歲?比第2個人大2歲。第2個人多少歲?比第1個人大2歲。第1個人多少歲?我10歲。表示為:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10;遞歸表示式:例5.19第72頁求解過程:第73頁用一個函數(shù)age()來求第n個人多少歲。main(){intage();/*申明函數(shù)原型*/printf("%d\n",age(5));}intage(intn)/*求第n個人多少歲*/

{intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}

第74頁利用遞歸方法處理以下問題1、求斐波那契亞數(shù)列第n項。2、求n階乘。從例題中能夠看到,有些問題,采取遞歸方法處理,會變得非常簡單,且源程序也很簡練。一個問題要采取遞歸方法處理時,要符合以下條件:1、能夠把一個問題轉(zhuǎn)化為一個新問題,而新問題處理方案仍與原問題相同,只是問題規(guī)模不一樣。它們只是有規(guī)律遞增或遞減。2、能夠經(jīng)過轉(zhuǎn)化過程使問題得到處理。3、必須有一個明確結(jié)束遞歸條件。第75頁5.6函數(shù)庫和文件

一個函數(shù)設(shè)計完后,我們能夠用三種方法處理它:(1)把它放在main()函數(shù)同一個文件中;(2)把它和寫好其它函數(shù)一起放在另一個文件中;(3)把它放在函數(shù)庫中。

5.6.1程序文件大小因為C語言允許分別編譯,所以一個文件最適宜規(guī)模是多大?這規(guī)模很主要,因為編譯時間與被編譯文件大小直接相關(guān)。普通來說,鏈接處理時間比編譯處理時間短得多,且不需要經(jīng)常去重新編譯已經(jīng)運行過代碼;另首先,不得不一樣時處理多個文件也確實是件厭煩事。對于上述問題用戶必須明確了解,因為每個用戶、每個編譯程序、每個操作系統(tǒng)環(huán)境都是不一樣,所以文件規(guī)模第76頁各不相同,但對大部分微型機和普通C編譯程序來說,源程序文件不應(yīng)長于10000個字節(jié)。建立短于5000個字節(jié)文件,能夠防止不少麻煩。5.6.2分類組織文件在開發(fā)一個大型程序時,最令人煩惱而又是最常碰到工作之一就是需要檢驗每個文件,以確定某個函數(shù)存放。(1)把概念上相關(guān)函數(shù)組織到一個文件中。假如在編寫正文編輯程序時,把刪除正文所用全部函數(shù)放進另一個文件,等等。(2)把全部通用函數(shù)放在一起。比如,在數(shù)據(jù)庫程序中,輸入/輸出格式編排函數(shù)是被其它函數(shù)調(diào)用通用函數(shù),應(yīng)把它們放進一個單獨文件里。(3)把最高層函數(shù)放進一個單獨文件中,假如空間允許,就和main()放在一起。最高層函數(shù)被用來開啟程序總體活動。這些例程從本質(zhì)上定義了程序操作。第77頁

5.7.1C語言預(yù)處理程序ANSI標準定義C語言預(yù)處理程序包含命令有:#define、#error、#include、#if、#else、#elif、#endif、#ifdef、#ifndef、#undef、#line、#pragma。非常顯著,全部預(yù)處理命令均以符號#開頭,下面介紹慣用預(yù)處理命令。

5.7.2#define命令#define定義了一個標識符及一個串。在源程序中每次碰到該標識符時,均以定義串代換它。ANSI標準將標識符定義為宏名,將替換過程稱為宏替換。命令普通形式為:#define標識符串注意:該語句沒有分號。在標識符和串之間能夠有任意個空格,串一旦開始,僅由一新行結(jié)束。5.7C語言預(yù)處理程序與注釋第78頁例5.20宏代換用于參數(shù)。#include<stdio.h>#defineMIN(a,b)(a<b)?a:bmain(){

intx,y;

x=10;

y=20;

printf("theminimumis:%d",MIN(x,y));}當(dāng)編譯該程序時,由MIN(a,b)定義表示式被替換,x和y用做操作數(shù),即printf()語句被代換后取以下形式:printf("theminimumis:%d",(x<y)?x:y);用宏代換代替實在函數(shù)一大好處是宏替換提升了代碼速度,因為不存在函數(shù)調(diào)用開銷。但提升速度也有代價,因為重復(fù)編碼而增加了程序長度。第79頁

5.7.3#include命令#include使編譯程序?qū)⒘硪辉次募度霂в?include源文件,被讀入源文件必須用雙引號或尖括號括起來。比如:#include"stdio.h"#include<stdio.h>這兩行代碼均使用C編譯程序讀入并編譯用于處理磁盤文件庫子程序。假如文件路徑名為文件標識符一部分,則僅在那些子目錄中搜索被嵌入文件。不然,假如文件名用雙引號括起來,則首先檢索當(dāng)前工作目錄。假如未發(fā)覺文件,則在命令行中說明全部目錄中搜索。假如仍未發(fā)覺文件,則搜索實現(xiàn)時定義標準目錄。假如沒有文件路徑名且文件名被尖括號括起來,則首先在編譯命令行中目錄內(nèi)檢索。假如文件沒找到,則檢索標準目錄,不檢索當(dāng)前工作目錄。第80頁

5.7.4注釋注釋,即用于解釋標注,是一些文字信息,用以向看源代碼讀者解釋這段代碼是什么意思,因為讀者認知空間和電腦完全不一樣,這在以后說明怎樣編程時會詳細討論。在C語言中,全部注釋由/*開始,以*/結(jié)束。在星號及斜杠之間不允許有空格。編譯程序忽略注釋開始符到注釋結(jié)束符間任何文本,也就是說注釋只是一個對一行或一段程序說明,起到備忘錄作用,而在程序編譯和執(zhí)行時忽略。注釋不但僅是對程序解釋,有時它對于程序調(diào)試也非常有用,譬如說能夠利用注釋屏蔽一條語句以觀察改變,發(fā)覺問題和錯誤。以后注釋語句將是我們在編程里最經(jīng)慣用到語句之一。比如,下面程序在屏幕上只打印“hello”而屏蔽掉了

溫馨提示

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

評論

0/150

提交評論