函數(shù)及變量的存儲市公開課獲獎課件_第1頁
函數(shù)及變量的存儲市公開課獲獎課件_第2頁
函數(shù)及變量的存儲市公開課獲獎課件_第3頁
函數(shù)及變量的存儲市公開課獲獎課件_第4頁
函數(shù)及變量的存儲市公開課獲獎課件_第5頁
已閱讀5頁,還剩69頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 函 數(shù)第1頁第1頁目的描述 C 語言中函數(shù)掌握 C 語言中常見內(nèi)置函數(shù)理解函數(shù)原型和函數(shù)返回值純熟掌握自定義函數(shù)定義和調(diào)用理解變量作用域、生命期理解變量存儲類型正確理解函數(shù)在C語言程序設計中作用和地位;理解函數(shù)、形參、實參、作用域、生存期概念;掌握各種函數(shù)定義、原型申明和調(diào)用辦法;理解全局變量、局部變量、靜態(tài)變量、靜態(tài)函數(shù)作用域和生存期;掌握遞歸函數(shù)編寫規(guī)則;掌握利用工程管理程序辦法; 第2頁第2頁6.1.1 什么是模塊化 模塊化程序設計辦法: 人們在求解某個復雜問題時,通常采用逐步分解、分而治之辦法,也就是將一個大問題分解成若干個比較容易求解小問題,然后分別求解。程序員在設計一個復雜

2、應用程序時,往往也是把整個程序劃分成若干個功效較為單一程序模塊,然后分別予以實現(xiàn),最后再把所有程序模塊象搭積木同樣裝配起來,這種在程序設計中分而治之策略,被稱為模塊化程序設計辦法。 6.1 概述第3頁第3頁maincabdefghijkl圖6-1 C程序模塊化C程序模塊化第4頁第4頁6.1.2 什么是函數(shù)?在C語言中,模塊就是一組邏輯相關(這也表達了軟件工程中“內(nèi)聚性”)語句集合或說是用于完畢特定任務程序代碼單元。依據(jù)規(guī)模大小,C語言中模塊有三種形式:語句塊(即復合語句)函數(shù)文獻。函數(shù)是C語言中最為慣用模塊單元。因此通常說C程序是由函數(shù)構(gòu)成;函數(shù)是C語言程序基本構(gòu)成部分。第5頁第5頁void

3、main() : x=x*x*x; y=y*y*y; z=z*z*z; ans1=x+y+z; a=a*a*a; b=b*b*b; c=c*c*c; ans2=a+b+c; :重復多次同一計算類型void main() : ans1=cube(x,y,z); ans2=cube(a,b,c); :int cube(int a,b,c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans;函數(shù)主程序ans函數(shù)能夠把相對獨立某個功效抽象出來,使之成為程序中一個獨立實體。能夠在同一個程序或其它程序中多次重復使用為何使用函數(shù)?第6頁第6頁使程序變得更簡短而

4、清楚 有助于程序維護能夠提升程序開發(fā)效率 提升了代碼重用性 函數(shù)機制長處第7頁第7頁6.2.1 函數(shù)分類 內(nèi)置函數(shù)(庫函數(shù)):由語言系統(tǒng)提供;用戶不必定義,也不必在程序中作類型闡明;只需在程序前包括有該函數(shù)定義頭文獻; 自定義函數(shù):用戶在程序中依據(jù)需要而編寫函數(shù);從用戶角度6.2 函數(shù)定義與使用第8頁第8頁內(nèi)置函數(shù)頭文獻用途double sqrt(double x)math.h計算x平方根double pow(double x, double y)計算xy次冪double ceil(double x)求不小于x最小整數(shù),并以double形式顯示double floor(double x)求小于

5、x最大整數(shù),并以double形式顯示int toupper(int x)ctype.h假如x為小寫字母,則返回相應大寫字母int tolower(int x)假如x為大寫字母,則返回相應小寫字母int rand(void)stdlib.h產(chǎn)生一個隨機數(shù)void exit(int retval)終止程序慣用庫函數(shù)使用庫函數(shù)普通辦法:1、函數(shù)功效2、函數(shù)參數(shù)數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用包括文獻第9頁第9頁 函數(shù)定義格式函數(shù)體合法標識符函數(shù)返回值類型函數(shù)類型 函數(shù)名(形參類型闡明表)闡明部分語句部分return 語句下列紅色為函數(shù)6個元素函數(shù)頭部第10頁第10頁

6、參數(shù):普通用于一個函數(shù)把數(shù)據(jù)傳遞給另一個函數(shù)(調(diào)用者和被調(diào)用者之間),實現(xiàn)函數(shù)之間通信。定義函數(shù)時候,函數(shù)參數(shù)是形式參數(shù),是對一件詳細事件也許需要數(shù)據(jù)假設。返回值: 即函數(shù)帶回來值。而返回值類型是在定義函數(shù)時指定,即用“返回值類型”指定函數(shù)類型。1、假如類型標識符為void則表示不需要帶回函數(shù)值;2、假如沒有類型標識,則TC2.0默認返回值類型是int(在vc+ 6.0中則認為默認為void,視編譯器不同而不同)。函數(shù)體:一對花括號里面內(nèi)容(包括申明部分和語句部分)又被稱為函數(shù)體,當函數(shù)體為空時候,該函數(shù)也被叫做空函數(shù),就是說它什么也不做。第11頁第11頁例6-1 計算兩個整數(shù)平均數(shù)函數(shù)。/*

7、 函數(shù)功效:就算平均數(shù)函數(shù)入口參數(shù):整型x,存儲第一個運算數(shù) 整型y,存儲第二個運算數(shù)函數(shù)返回值:平均數(shù)*/int Average(int x , int y) int result; result=(x+y)/2; return result;第12頁第12頁 大多數(shù)情況下,調(diào)用者(主調(diào)函數(shù))和被調(diào)用者(被調(diào)用函數(shù))之間有數(shù)據(jù)傳遞關系,也就是說該函數(shù)有參數(shù)(能夠稱為有參函數(shù),不然叫做無參函數(shù))。在定義函數(shù)時函數(shù)名后面括號中參數(shù)稱為“形式參數(shù)”(簡稱“形參”),在主調(diào)函數(shù)中調(diào)用一個函數(shù)時,函數(shù)名后面括號中參數(shù)(能夠是一個“表示式”)稱為“實際參數(shù)”(簡稱“實參”)。參數(shù)和參數(shù)傳遞方式6.2.3

8、 函數(shù)參數(shù)和返回值第13頁第13頁例6-2調(diào)用函數(shù)時數(shù)據(jù)(參數(shù))傳遞。#include void main() int max(int x, int y); int a, b, c; scanf(%d, %d,&a, &b); c=max(a, b); printf(max is %d, c);int max(int x, int y) /*定義有參函數(shù)max*/ int z; z=xy?x:y; return(z); 運營情況下列:7,8Max is 8第14頁第14頁關于形參和實參闡明:在定義函數(shù)中指定形參,在函數(shù)尚未被調(diào)用時,它們并不占用內(nèi)存中存儲單元。只有在發(fā)生函數(shù)調(diào)用時,函數(shù)max中

9、形參才被分派內(nèi)存單元。在調(diào)用結(jié)束后,形參所占內(nèi)存單元也被釋放。實參能夠是常量、變量或表示式,比如:max(3,a+b);但要求它們有擬定值。在調(diào)用時將實參值賦給形參。參數(shù)和參數(shù)傳遞方式第15頁第15頁關于形參和實參闡明:在被定義函數(shù)中,必須指定形參類型。實參加形參類型應相同或賦值兼容。在C語言中,實參向形參數(shù)據(jù)傳遞是“值傳遞”,單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在內(nèi)存中,實參單元與形參單元是不同單元。參數(shù)和參數(shù)傳遞方式第16頁第16頁2222abxy圖6-3 參數(shù)值傳遞221015abxy圖6-4 實參值不變參數(shù)和參數(shù)傳遞方式第17頁第17頁int Check (int n

10、um) if (num % 5 = 0) return 1; else return 0;通常,希望通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個擬定值,這就是函數(shù)返回值,也稱函數(shù)值。C 語言中 return 語句用于向調(diào)用函數(shù)返回值,語法下列:return (); 函數(shù)返回值第18頁第18頁void swap(int x, int y) int z; z=x; x=y; y=z; printf(nx=%d,y=%d,x ,y);main( ) int a= 10,b=20; swap(a,b); printf(na=%d,b=%dn,a,b);程序輸出結(jié)果:x=20,y=10a=10,b=20形式參數(shù)(形

11、參)實際參數(shù)(實參)【例】編一程序,將主函數(shù)中兩個變量值傳遞給swap函數(shù)中兩個形參,互換兩個形參值。單向值傳遞第19頁第19頁c=max(a, b);(調(diào)用main函數(shù))(max函數(shù))int max(int x, int y) int z; z=xy?x:y; return(z);圖6-2 函數(shù)調(diào)用函數(shù)返回值第20頁第20頁void main() : ans1=cube(2,5,7); ans2=cube(2,3,4); :int cube(int a,int b,int c) int ans; ans=(a*a*a)+(b*b*b)+(c*c*c); return ans;函數(shù)主程序ans

12、參數(shù)(實參)參數(shù)(形參)返回值第21頁第21頁(1)函數(shù)返回值是通過函數(shù)中return語句取得。闡明return語句將被調(diào)用函數(shù)中一個擬定值帶回主調(diào)函數(shù)中去。 假如需要從被調(diào)用函數(shù)帶回一個數(shù)值,則被調(diào)用函數(shù)中必須包括reutrn 語句。假如不需要則能夠不要return語句。一個函數(shù)中能夠有一個以上return語句,執(zhí)行到哪一個 return語句,則哪個語句起作用。return語句后面括號也能夠不要,如“return z;”和“return (z);”等價。return后面值能夠是一個表示式。比如,例6.2中函數(shù)max能夠改寫下列: max(int x, int y) return (xy?x:

13、y); 第22頁第22頁(2)函數(shù)類型。既然函數(shù)有返回值,這個值當然應屬于某一個擬定類型,應當在定義函數(shù)時指定函數(shù)值類型。 比如下面是3個函數(shù)首行: int max(float x, float y) /*函數(shù)值為整型*/ char letter(char c1, char c2) ) /*函數(shù)值為字符型*/ double min(int x, int y) )/*函數(shù)值為雙精度型*/ 在C語言中,凡不加類型闡明函數(shù),自動按整型處理。第23頁第23頁(3)在定義函數(shù)時指定函數(shù)類型普通應當和return語句中表示式類型一致。 例6.2中指定max函數(shù)值為整型,而變量z也被指定為整型,通過retu

14、rn語句把z值作為max函數(shù)值,由max帶回主調(diào)函數(shù)。z類型與max函數(shù)類型是一致,是正確。假如函數(shù)值類型和return語句中表示式值不一致,則以函數(shù)類型為準。對數(shù)值型數(shù)據(jù),能夠自動進行類型轉(zhuǎn)換。即函數(shù)類型決定返回值類型。(4)對于不帶返回值函數(shù),應當用“void”定義函數(shù)為“無類型”(或稱“空類型”)。 這樣,系統(tǒng)就確保不使函數(shù)帶回任何值,即嚴禁在調(diào)用函數(shù)中使用被調(diào)用函數(shù)返回值。此時在函數(shù)體中不得出現(xiàn)return語句。第24頁第24頁例6-3 返回值類型與函數(shù)類型不同。#include void main() int max(int x, int y); float a, b int c;

15、scanf(%f, %f, &a, &b); c=max(a, b); printf(max is %d, c);int max(float x, float y) float z;/*z為實型變量*/ z=xy?x:y; return(z);運營情況下列:1.5,2.5Max is 2第25頁第25頁6.3.1 函數(shù)調(diào)用普通形式 函數(shù)調(diào)用普通形式為 函數(shù)名(實參表列);注意事項:(1)假如是調(diào)用無參函數(shù),則“實參表列”能夠沒有,但是括號不能省略。(2)假如實參表列包括多個實參,則各個參數(shù)間用逗號隔開。 實參能夠是常量、變量、表示式、函數(shù)等 6.3 函數(shù)調(diào)用 第26頁第26頁注意事項: (3)

16、 賦值對應關系: 實參1 - 形參1 實參2 - 形參2 實參n - 形參n (4)實參表求值次序(即實參賦值給形參次序) 因系統(tǒng)而定。TC、BC、VC均是自右向左,也就是說最右邊實參最先賦值給最右邊形參, 最左邊實參最終賦值給最左邊形參。但VC與TC、BC在詳細賦值時稍有不同,注意它們之間區(qū)分。 第27頁第27頁例6-4 實參求值順序。#include void main( ) int f(int a, int b); /*函數(shù)申明*/ int i=2, p; p=f(i, +i); /*函數(shù)調(diào)用*/ printf(%dn, p);int f(int a, int b) /*函數(shù)定義*/ i

17、nt c; if(ab) c=1; else if(a=b) c=0; else c= -1; return (c);問:在Turbo C 2.0和Turbo C+ 3.0系統(tǒng)上運營結(jié)果?原型申明 i為實參 a、b為形參 第28頁第28頁若按自左至右順序求實參值,則函數(shù)調(diào)用相稱于f(2,3),程序運營應得結(jié)果為“-1”。 若按自右至左順序求實參值,則它相稱于f(3,3),程序運營結(jié)果為“0”。分析: 假如本意是按自左而右順序求實參值,即f(2,3)調(diào)用,可改寫成: j=i; k=+i; p=f(j, k); 假如本意是自右而左求實參值,即f(3,3)調(diào)用,可改寫成: j=+i; p=f(j,

18、j);是否有辦法讓參數(shù)擬定?第29頁第29頁1.函數(shù)語句 把函數(shù)調(diào)用作為一個語句。這時不要求函數(shù)帶來返回值,只要求函數(shù)完畢一定操作。比如: printstar ( ); printf (“Hello,World!n”);2.函數(shù)表示式 函數(shù)出現(xiàn)在一個表示式中,這種表示式稱為函數(shù)表示式。這是要求函數(shù)帶回一個擬定值以擬定參與表示式運算。比如: C=2*max(a, b); 函數(shù)max是表示式一部分,它值乘2再賦給c。6.3.2 函數(shù)調(diào)用方式 按函數(shù)在程序中出現(xiàn)位置分,可有3種函數(shù)調(diào)用方式:第30頁第30頁3.函數(shù)參數(shù) 函數(shù)調(diào)用作為一個函數(shù)實參。比如: M=max(a, max(b, c); 其中m

19、ax(b,c)是一次函數(shù)調(diào)用,它值作為max另一次調(diào)用實參。M值是a、b、c三者中最大者。比如: printf(“%d”, max(a, b); 也是把max(a, b)作為printf函數(shù)一個函數(shù)。 函數(shù)調(diào)用作為函數(shù)參數(shù),實質(zhì)上也是函數(shù)表示式形式調(diào)用一個,由于函數(shù)參數(shù)本來就要求是表示式形式。第31頁第31頁6.3.3 對被調(diào)用函數(shù)申明和函數(shù)原型#include float count (int, int);void main() . . . . . .float count(int x,int y) . . .函數(shù)原型闡明在形式上與函數(shù)頭部類似,最后加一個分號。原型闡明中參數(shù)表里參數(shù)名能夠不

20、寫(只寫參數(shù)類型)。第32頁第32頁問題描述:依據(jù)用戶選擇求不同形狀面積。函數(shù)調(diào)用示例#includevoid AreaOfRect();void AreaOfTriangle();void AreaOfRound();void main() int select; do printf( 0、退出n 1、長方形n 2、三角形n 3、圓形n);printf(請選擇功效:);scanf(%d,&select);if(select = 0) break;switch(select) case 1 : AreaOfRect(); break; /長方形 case 2 : AreaOfTriangle(

21、); break; /三角形 case 3 : AreaOfRound(); break; /圓形 default : printf(輸入有誤,請在 04 之間選擇。n); while(1);void AreaOfRect() int x,y; printf(請輸入長方形長:); scanf(%d,&x); printf(請輸入長方形寬:); scanf(%d,&y); printf(面積為:%dn,(x * y); void AreaOfTriangle() int x,y; printf(請輸入三角形底:); scanf(%d,&x); printf(請輸入三角形高:); scanf(%d

22、,&y); printf(面積為:%dn,(x * y)/2); void AreaOfRound() int r; printf(請輸入圓形半徑:); scanf(%d,&r); printf(面積為:%dn,3.14*r*r); 函數(shù)原型第33頁第33頁 在一個函數(shù)中調(diào)用另一個函數(shù)(即被調(diào)用函數(shù))需要具備條件下列:首先被調(diào)用函數(shù)必須是已經(jīng)存在函數(shù)(庫函數(shù)或自定義函數(shù))。假如使用庫函數(shù),還應當在文本開頭用#include命令將調(diào)用相關庫函數(shù)時所需用到信息(這些信息是一些常量和函數(shù)原型)“包括”到本文獻中來,不然函數(shù)將不能正常地得到調(diào)用。比如,前面經(jīng)慣用到過: #include 3. 假如使用

23、用戶自定義函數(shù),則假如該函數(shù)被定義位置在調(diào)用它函數(shù)(即主調(diào)函數(shù))后面(在同一文獻中),應當在主調(diào)函數(shù)中對被調(diào)函數(shù)作申明。假如被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前,能夠不必加以申明。第34頁第34頁對于函數(shù)位置: 對于非int函數(shù),調(diào)用單位位置要在被調(diào)用單位在下面,不然編譯產(chǎn)生錯誤。處理辦法是:在調(diào)用單位加上被調(diào)用函數(shù)聲(說)明。void f() main( ) f ( ); void f( ) main( ) f (); void f( ) main( )void f( ); f (); 第35頁第35頁 例6-5 編制子函數(shù)實現(xiàn)求兩個單精度實數(shù)和,main函數(shù)調(diào)用該函數(shù)時候要先申明。/*6_5.

24、c*/#include void main() float add(float x, float y); /*對被調(diào)用函數(shù)add申明*/ float a, b, c; scanf(%f, %f, &a ,&b); c=add(a, b); printf(sum is %fn, c);float add(float x, float y) /*函數(shù)首部*/ float z; /*函數(shù)體*/ z=x+y; return (z);運營情況下列:3.6,6.5sum is 10.100000float add(float, float);第36頁第36頁總而言之,函數(shù)原型普通形式有兩種:(1)函數(shù)類型

25、 函數(shù)名(參數(shù)類型1 ,參數(shù)類型2,參數(shù)類型n);(2)函數(shù)類型 函數(shù)名(參數(shù)類型1 參數(shù)名1,參數(shù)類型2 參數(shù)名2,參數(shù)類型n 參數(shù)名n);第37頁第37頁應該注意到函數(shù)原型與函數(shù)定義是不同。函數(shù)定義是指對函數(shù)功效確實立,包含指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整、獨立函數(shù)單位。函數(shù)申明作用則是把函數(shù)名字、函數(shù)類型以及形參類型、個數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢驗(比如,函數(shù)名是否正確,實參加形參類型和個數(shù)是否一致等)。第38頁第38頁6.3.4 嵌套調(diào)用 在C語言中,函數(shù)定義是平行,不允許進行函數(shù)嵌套定義,即在一個函數(shù)體中不允許定義另一個函數(shù)

26、。而函數(shù)之間調(diào)用能夠是任意,即允許在一個函數(shù)體內(nèi)再調(diào)用其它函數(shù),在函數(shù)體中再調(diào)用其它函數(shù)稱為函數(shù)嵌套調(diào)用。 第39頁第39頁void reverse() : :#includevoid main():palindrome();:void palindrome() : reverse(); :從一個函數(shù)調(diào)用另一個函數(shù)稱為函數(shù)嵌套調(diào)用 比如:C要求:函數(shù)定義不可嵌套,但能夠嵌套調(diào)用函數(shù)第40頁第40頁例6-6函數(shù)嵌套調(diào)用。main() aia();aia() ber();ber() cal();cal() .圖6-5 函數(shù)嵌套調(diào)用89246135710 函數(shù)main調(diào)用了aia,aia調(diào)用了ber

27、, ber又調(diào)用了cal。其調(diào)用過程和返回過程如圖所表示。void aia(), ber(), cal();main() printf(Im in main.n); aia();void aia() printf(Now Im in aia.n); ber();void ber() printf(Now Im in ber.n); cal();void cal() printf(Now Im in cal.); 第41頁第41頁 一個函數(shù)直接或間接地調(diào)用函數(shù)本身,這種調(diào)用稱為遞歸調(diào)用,前者稱為直接遞歸,后者稱為間接遞歸。遞歸調(diào)用函數(shù)稱為遞歸函數(shù)。 由于遞歸非常符合人們思維習慣,并且許多數(shù)學函數(shù)

28、及許多算法或數(shù)據(jù)結(jié)構(gòu)都是遞歸定義,因此,遞歸調(diào)用頗具實用價值。6.3.4 函數(shù)遞歸調(diào)用 第42頁第42頁/* 此函數(shù)用于計算 n 階乘 */int factorial(int n) int a; if (n = 1) return 1; else a = n * factorial(n-1); return a; 在一個函數(shù)體內(nèi)調(diào)用本身稱為函數(shù)遞歸調(diào)用 第43頁第43頁例6-7利用函數(shù)遞歸調(diào)用來求n階乘。#include long fact(); /*申明被調(diào)用函數(shù)返回值為長整型*/main() /*主函數(shù)*/ int h,i; printf(請輸入任一正整數(shù):n); scanf(%d, &h

29、); for(i=0; i=h; +i) printf(%d!=%ldn, i , fact(i);long fact(int n) /*求階乘函數(shù)*/ long int res; if(n=0) res=1; else res=n*fact(n-1); /*遞歸調(diào)用*/ return(res);請輸入任一正整數(shù): 60!等于11!等于12!等于23!等于64!等于245!等于1206!等于720程序執(zhí)行后顯示:第44頁第44頁6.3.6 程序設計舉例(使用函數(shù)編寫程序)例6-8 輸出5之內(nèi)數(shù)字金字塔。例6-9 輸入精度e,使用格里高利公式求近似值,準確到最后一項絕對值小于e。要求定義和調(diào)用函

30、數(shù)funpi(e)求近似值。例6-10 采用遞歸方式實現(xiàn)二分查找。二分查找算法是對有序數(shù)列進行查找操作一個有效操作。事實上,這種查找辦法是一個遞歸過程。第45頁第45頁結(jié)構(gòu)體變量作為函數(shù)參數(shù) 140頁例5-3 將鍵盤輸入相關學生檔案信息用函數(shù)list實現(xiàn)。#include struct STUD char name20; long num; int age; char sex; float score; ;void list(struct STUD stud) printf(%-20s%-10ld%-4d%-4c%-6.2fn,,stud.num,stud.age,stud.

31、sex,stud.score); void main( ) struct STUD stud3; int i; for(i=0;i3;i+) printf(Input all information about the No.%d student:n,i+1); getchar(); gets(); scanf(%ld,%d,%c,%f,&studi.num,&studi.age,&studi.sex,&studi.score);printf(n%-20s%-10s%-4s%-4s%-6sn,Name,Num,Age,Sex,Scores); for(i=0;i y ? x

32、 : y; return (z);void f2 ( ) printf (%dn, z );局部變量 變量x、y、z作用域引用錯誤!第53頁第53頁 闡明 (1) 主函數(shù)main( )中定義變量也是局部變量,它只能在主函數(shù)中使用,其它函數(shù)不能使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義局部變量。 int f3 (int x);void main ( ) int a = 2, b; b = a + y ; printf (%dn, b); int f3 ( int x ) int y; y = a + 5; return ( y );局部變量 變量a、b作用域變量x、y作用域局部變量 錯誤!錯誤

33、!第54頁第54頁 闡明 (2) 形參變量屬于被調(diào)用函數(shù)局部變量;實參變量則屬于全局變量或調(diào)用函數(shù)局部變量。 (3) 允許在不同函數(shù)中使用相同變量名,它們代表不同對象,分派不同單元,互不干擾,也不會發(fā)生混同。 #include void subf ( );void main ( ) int a, b; a=3, b=4; printf (main: a = %d, b = %dn, a, b); subf ( ); printf (main: a = %d, b = %dn, a, b);void subf ( ) int a, b; a = 6, b = 7; printf(subf: a

34、= %d, b = %dn,a,b);運營結(jié)果:main: a = 3, b = 4subf: a = 6, b = 7main: a = 3, b = 4變量名相同 第55頁第55頁 闡明 (4) 在復合語句中定義變量也是局部變量,其作用域只在復合語句范圍內(nèi)。其生存期是從復合語句被執(zhí)行時刻到復合語句執(zhí)行完畢時刻。 #include void main ( ) int a = 2, b = 4; int k, b; k = a + 5; b = a * 5; printf (k = %dn, k); printf (b = %dn, b); printf (b = %dn, b); a = k

35、 + 2;main中局部變量 復合語句中局部變量 mian中變量a、b作用域 復合語句中變量k、b作用域輸出k = 7 輸出b = 10 輸出b = 4 錯誤!第56頁第56頁6.6.2 全局變量作用域和生存期 定義 在函數(shù)外部作定義闡明變量,也稱為外部變量 。它不屬于哪一個函數(shù),而屬于一個源程序文獻。 作用域 從定義變量位置開始到本源文獻結(jié)束,及有extern闡明其它源文獻。 生存期 與程序相同。即從程序開始執(zhí)行到程序終止這段時間內(nèi),全局變量都有效。 #include #include int sign ( );/計算數(shù)n平方根float sqr ( ) if ( n 0 ) return

36、(sqrt(n); else return (-1);float n = 0;void main ( ) int s; float t; scanf (%f, &n); s = sign ( ); /取符號 t = sqr ( ); /取平方根 printf (s = %d t = %f , s, t);/取數(shù)n符號int sign ( ) int r = 0; if (n 0) r = 1; if (n 0) r = -1; return ( r );定義全局變量,并賦初值局部變量全局變量n作用域 局部變量s、t作用域局部變量局部變量r作用域錯誤!第57頁第57頁 闡明 (1) 應盡也許少使

37、用全局變量。 全局變量在程序所有執(zhí)行過程中始終占用存儲單元 減少了函數(shù)獨立性、通用性、可靠性及可移植性 減少程序清楚性,容易犯錯 (2) 若外部變量與局部變量同名,則外部變量被屏蔽。要引用全局變量,則必須在變量名前家上兩個冒號“:” #include int a = 10; /全局變量void main ( ) int a = 100; /局部變量(與全局變量同名) printf (local a = %dn, a); printf (global a = %dn, :a);運營結(jié)果:local a = 100global a = 10注意:局部變量與全局變量同名極易造成程序員犯邏輯錯誤。第5

38、8頁第58頁#include int a=3,b=5;max(int a,int b)int c;c=ab?a:b;return(c);main()int a=8;printf(%dn,max(a,b);運營結(jié)果?第59頁第59頁 闡明 (3) 全局變量定義必須在所有函數(shù)之外,且只能定義一次,并可賦初始值。全局變量定義普通形式為: extern 類型闡明符 全局變量名1 = 初始值1, , 全局變量名n = 初始值n;可缺省!char ch = Y; void main ( ) char ch; void func ( ) 定義全局變量ch錯誤!ch只能定義一次例:int a = 2, b =

39、 4; extern int a = 2, b = 4; 第60頁第60頁 闡明 (4) 對全局變量進行闡明,可擴展全局變量作用域。全局變量闡明普通形式為: extern 類型闡明符 全局變量名1, ,全局變量名n;不可缺省!不可賦初值!void gx ( ), gy ( );void main ( ) extern int x, y; printf (1: x = %dty = %dn, x, y); y = 246; gx ( ); gy ( );extern int x, y;void gx ( ) x = 135; printf (2: x = %dty = %dn, x, y);in

40、t x = 0, y = 0;void gy ( ) printf (3: x=%dty=%dn, x, y);全局變量定義未闡明前作用域全局變量闡明闡明后作用域全局變量闡明闡明后作用域運營結(jié)果: 1: x = 0 y = 0 2: x = 135 y = 246 3: x = 135 y = 246第61頁第61頁 闡明 (5) 全局變量定義與全局變量闡明區(qū)別 extern int a; void func1 ( ) /引用變量aextern int a = 2; void func2 ( ) /引用變量a誰是定義?誰是闡明?全局變量定義(由于賦了初值)全局變量闡明 注意:兩者中有且只能有一

41、個對變量a賦初始值,不能都對變量a賦初始值或都不賦值,不然編譯錯! 第62頁第62頁6.7 變量生命期-變量存儲類型 概述變量屬性 數(shù)據(jù)類型:變量所持有數(shù)據(jù)性質(zhì)(操作屬性)。要求了它們?nèi)≈捣秶涂蓞⑴c運算 。 存儲類型: 要求了變量占用內(nèi)存空間方式,也稱為存儲方式。 存儲類型:存儲器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū) auto-自動型 register-存儲器型 static -靜態(tài)型 extern-外部型動態(tài)存儲區(qū)靜態(tài)存儲區(qū)存儲類型闡明符 數(shù)據(jù)類型闡明符 變量名1,變量名2,變量名n;變量定義完整形式應為: 第63頁第63頁1、動態(tài)變量(auto型變量)auto 數(shù)據(jù)類型闡明符 變量名1,變量名2,變量名n; 定義格式 闡明 存儲類型闡明符auto能夠省略。 動態(tài)變量只能在函數(shù)內(nèi)或復合語句中定義,它屬于局部變量(動態(tài)局部變量)。 void func ( ) int i, j, k; 等價于 auto int i, j, k;auto int k; void func ( ) 錯誤!動態(tài)變量不可定義在函數(shù)外 第64頁第64頁2、靜態(tài)變量(static型變量) 靜態(tài)變量類型闡明符是static。 靜態(tài)變量屬于靜態(tài)存儲類型。 靜態(tài)局部變量 在局部變

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論