專升本C語言課件C08存儲屬性及預(yù)處理課件_第1頁
專升本C語言課件C08存儲屬性及預(yù)處理課件_第2頁
專升本C語言課件C08存儲屬性及預(yù)處理課件_第3頁
專升本C語言課件C08存儲屬性及預(yù)處理課件_第4頁
專升本C語言課件C08存儲屬性及預(yù)處理課件_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、專升本C語言課件C08存儲屬性及預(yù)處理C程序設(shè)計(jì)八 存儲屬性及預(yù)處理 專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.1變量的作用域變量有兩個(gè)方面的屬性:數(shù)據(jù)類型和存儲類別變量的存儲屬性指:變量的作用域和生存期。作用域有2種:局部變量:在函數(shù)內(nèi)有效(定義在函數(shù)內(nèi)或形式參數(shù))全局變量:從定義點(diǎn)到文件的結(jié)尾有效。(定義在函數(shù)外,又稱外部變量)注意分析作用域時(shí)不涉及程序運(yùn)行的流程。以下哪些是局部變量,哪些是全局變量?判斷劃線語句是否正確。float x=6,y;main() int i; i=x; x=j;int j;fun1(int *p) int a;

2、a=i*2; fun2() int b; b=x+j;對錯(cuò)錯(cuò)對專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量的作用:(1)可以從函數(shù)得到多個(gè)返回值。(2)簡化形參。下面程序采用全局變量得到多個(gè)值int a,b;main().swap( );.swap( )int c;c=a;a=b;b=c;專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量的作用:(1)可以從函數(shù)得到多個(gè)返回值。(2)簡化形參。比較如下的兩個(gè)程序:采用全局變量可以簡化形參。main().fun1(a,b,p);fun2(a,b,p,4);.fu

3、n1(int a,int b,int *p).fun2(int a,int b,int *p,int n).fun1(a,b,p);.int a,int b,int *p;main().fun1();fun2(4);.fun1().fun2(int n).fun1();.專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量的作用:(1)可以從函數(shù)得到多個(gè)返回值。(2)簡化形參。全局變量的缺點(diǎn):使函數(shù)的通用性降低。程序容易出錯(cuò)。以下的swap函數(shù)拿到其他程序中不能用。int a,b;main().swap( );.swap( )int c;c=a;a=b;b

4、=c;專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量與局部變量同名時(shí),全局變量被屏蔽。float x=6,y;main() int i; i=x; x=j;int j;fun2() int b,x=5; b=x+j; 這時(shí)的x是局部變量專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量與局部變量同名時(shí),全局變量被屏蔽。程序分析:int a=1;main()int a=7,b=5;fun(a+b);printf(%d,%dn,a,b);fun(int b)b=a+b;a=a*2;printf(%d,%dn,a,b

5、);2,127,5專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性全局變量與局部變量同名時(shí),全局變量被屏蔽。程序分析:int a=1;main()int a=7,b=5;while(b100)b=b*fun(+a);printf(%d,%dn,a,b);fun(int b)b=a+b;a=a*2;return(b);9,495專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.2變量的生存期變量有2種生存期:動(dòng)態(tài)存儲:在函數(shù)被調(diào)用時(shí)分配空間,函數(shù)結(jié)束時(shí)釋放。動(dòng)態(tài)存儲變量定義時(shí),初值是不確定的值。靜態(tài)存儲:在編譯時(shí)被賦初值是

6、0,在整個(gè)程序運(yùn)行時(shí)一直存在。靜態(tài)存儲main()fun1();fun1()int a; /*a是動(dòng)態(tài)存儲的變量*/fun2()static int b; /*a是靜態(tài)存儲的變量*/b是靜態(tài)變量,則不管函數(shù)fun2有沒有被調(diào)用,變量b都會在程序一開始運(yùn)行時(shí)就被定義好了。并且初值是0專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.2變量的生存期main()int i;for(i=1;i=10;i+)fun1();fun2();fun1()int a;fun2()static int b;變量a,b分別被分配空間幾次?a 10次b 1次專升本C語言課件C0

7、8存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性各種變量的生存期外部變量:靜態(tài)局部變量: 動(dòng)態(tài) 局部變量(auto) 形參 函數(shù)調(diào)用時(shí)分配,并且 被賦予實(shí)參的值。 register 寄存器變量 速度較快 靜態(tài)static 靜態(tài)局部變量 既是局部變量,又是 靜態(tài)變量判斷題:(1)只要是局部變量都可以定義為寄存器變量。錯(cuò),靜態(tài)局部變量不可以。(2)用register定義100變量,其中有些變量將被分配內(nèi)存單元。對。(3)靜態(tài)局部變量定義時(shí)自動(dòng)賦初值為0對(4)外部變量不可以用auto說明存儲類型。對。(5)外部變量必然是靜態(tài)存儲的變量。對。(6)程序執(zhí)行到定義靜態(tài)變量時(shí),該變量被創(chuàng)建

8、,一直到程序結(jié)束。錯(cuò)。程序一開始就已創(chuàng)建。專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性各種變量的生存期外部變量:靜態(tài)局部變量: 動(dòng)態(tài) 局部變量(auto) 形參 函數(shù)調(diào)用時(shí)分配,并且 被賦予實(shí)參的值。 register 寄存器變量 速度較快 靜態(tài)static 靜態(tài)局部變量 既是局部變量,又是 靜態(tài)變量外部變量: 定義在函數(shù)的外部int x;動(dòng)態(tài)局部變量:定義在函數(shù)內(nèi)部auto int x;或者 int x;形參:void abc(int x, char y) 。寄存器變量:定義在函數(shù)內(nèi)部register int x,y,z;靜態(tài)局部變量:定義在函數(shù)內(nèi)部st

9、atic int x;專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性各種變量的生存期外部變量:靜態(tài)局部變量: 動(dòng)態(tài) 局部變量(auto) 形參 函數(shù)調(diào)用時(shí)分配,并且 被賦予實(shí)參的值。 register 寄存器變量 速度較快 靜態(tài)static 靜態(tài)局部變量 既是局部變量,又是 靜態(tài)變量 以下程序的輸出的結(jié)果是int x=3;main() int i;for(i=1;ix;i+)incre();incre() static int x=1;x*=x+1;printf( %d,x);A) 3 3 B) 2 2 C) 2 6 D) 2 5C專升本C語言課件C08存儲

10、屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.3 擴(kuò)展外部變量的作用域用extern聲明外部變量,可以擴(kuò)展外部變量的作用域。(1)在一個(gè)文件內(nèi)擴(kuò)展。在外部變量的定義點(diǎn)之前的函數(shù)內(nèi),用extern聲明外部變量,就可以使用。如extern a,b;或extern int a,b;如何在main函數(shù)中使用外部變量x?main()int a;a=x+4;.int x;fun1().fun2().extern x;專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.3 擴(kuò)展外部變量的作用域用extern聲明外部變量,可以擴(kuò)展外部變量的作用域。(1)

11、在一個(gè)文件內(nèi)擴(kuò)展。(2)在多個(gè)文件擴(kuò)展。一個(gè)C程序可以由多個(gè)源文件組成,假如兩個(gè)文件共用一個(gè)外部變量x,必須在一個(gè)文件內(nèi)定義,另一個(gè)文件內(nèi)用extern聲明。文件1int x;main().fun1().文件2extern x;fun3().x+;fun2().專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.3 擴(kuò)展外部變量的作用域用extern聲明外部變量,可以擴(kuò)展外部變量的作用域。(1)在一個(gè)文件內(nèi)擴(kuò)展。(2)在多個(gè)文件擴(kuò)展。一個(gè)C程序可以由多個(gè)源文件組成,假如兩個(gè)文件共用一個(gè)外部變量x,必須在一個(gè)文件內(nèi)定義,另一個(gè)文件內(nèi)用extern聲明。(3)

12、限制外部變量只能在本文件使用。定義外部變量時(shí)可以用static。這樣外部變量就不能被其他文件引用。文件1static int x;main().fun1().文件2extern x;fun3().x+;fun2().x不能引用專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.3 擴(kuò)展外部變量的作用域用extern聲明外部變量,可以擴(kuò)展外部變量的作用域。(1)在一個(gè)文件內(nèi)擴(kuò)展。(2)在多個(gè)文件擴(kuò)展。一個(gè)C程序可以由多個(gè)源文件組成,假如兩個(gè)文件共用一個(gè)外部變量x,必須在一個(gè)文件內(nèi)定義,另一個(gè)文件內(nèi)用extern聲明。(3)限制外部變量只能在本文件使用。定義外

13、部變量時(shí)可以用static。這樣外部變量就不能被其他文件引用。假如一個(gè)程序由如下兩個(gè)文件組成,判斷以下使用是否正確?文件1static int y;extern z;extern a;int b;static int x;文件2static int y;int z;extern a;int b;extern x;YYNNN專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.1 變量的存儲屬性8.1.3 擴(kuò)展外部變量的作用域用extern聲明外部變量,可以擴(kuò)展外部變量的作用域。(1)在一個(gè)文件內(nèi)擴(kuò)展。(2)在多個(gè)文件擴(kuò)展。一個(gè)C程序可以由多個(gè)源文件組成,假如兩個(gè)文件共用一個(gè)外部變量x

14、,必須在一個(gè)文件內(nèi)定義,另一個(gè)文件內(nèi)用extern聲明。(3)限制外部變量只能在本文件使用。定義外部變量時(shí)可以用static。這樣外部變量就不能被其他文件引用。變量x和y有什么區(qū)別?static int x;main().fun1()static int y;.x是外部變量,但不能被其他文件引用y是靜態(tài)局部變量,只能在本函數(shù)使用專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.2 內(nèi)部函數(shù)與外部函數(shù)外部函數(shù):可以被其他文件調(diào)用。格式:extern 類型 函數(shù)名(形參)或 類型 函數(shù)名(形參)內(nèi)部函數(shù):一個(gè)函數(shù)只能在本文件中調(diào)用。格式:static 類型 函數(shù)名(形參)其他文件調(diào)用

15、之前需用extern聲明文件1 文件2int fun1(int a) extern fun1(int a);. b=fun1(3);判斷題:(1)不加extern定義的函數(shù)可以被其他文件調(diào)用。(2)一個(gè)文件調(diào)用其他文件中的函數(shù)時(shí)要先聲明。(3)一個(gè)文件用extern聲明函數(shù),就可以引用其他文件中的任何函數(shù)。(4)一個(gè)文件中的各個(gè)函數(shù)要么都可以被其他文件調(diào)用,要么都不可以。YYNN專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.3 宏定義C語言中的一些操作稱為編譯預(yù)處理:宏定義,文件包含,條件編譯。編譯預(yù)處理是在編譯之前進(jìn)行。預(yù)處理命令以#開頭,一般不加分號。宏定義有2種:(1)

16、不帶參數(shù)的宏定義#define PI 3.1415926(2)帶參數(shù)的宏定義#define S(u,v) u*v替換時(shí)宏和參數(shù)都要進(jìn)行替換。宏替換時(shí)不進(jìn)行語法分析。分析結(jié)果#define MU(a,b) b-amain()int x=4,y=2;x=MU(y*2,3);y=MU(x,y)*4;printf(%d,y);在運(yùn)行之前先要進(jìn)行宏替換x=3-y*2;y=y-x*4;專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.3 宏定義宏的優(yōu)點(diǎn):(1)速度比函數(shù)快。(2)不受數(shù)據(jù)類型限制。(3)不受返回值個(gè)數(shù)限制。宏的缺點(diǎn):(1)功能有限。(2)源程序變長。(3)容易出錯(cuò)。分析結(jié)果#

17、define s) a=a+b;b=a-b;a=a-b;main()int x=4,y=2;float u=2.5,v=-3.3;s); /*不受返回值個(gè)數(shù)限制*/s); /*不受數(shù)據(jù)類型限制 */.專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.4 文件包含將另一個(gè)源文件的內(nèi)容包含到本文件中。#include 文件名先在當(dāng)前目錄找,再到存放庫函數(shù)頭文件的目錄中查找。#include 僅在存放庫函數(shù)頭文件的目錄中查找。專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.4 條件編譯條件編譯是為了加強(qiáng)程序的可移植性。#ifdef 標(biāo)識符 程序段1#else 程序段2#endif如果之前標(biāo)識符已被#define定義過,則編譯程序段1,否則編譯程序段2。#define computer 0.#ifdef computer#define INTEGER_SIZE 16#else#define INTEGER_SIZE 32#endif專升本C語言課件C08存儲屬性及預(yù)處理八 存儲屬性及預(yù)處理 8.4 條件編譯條件編譯的優(yōu)點(diǎn)是代碼較短運(yùn)行稍快#ifdef 標(biāo)識

溫馨提示

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

最新文檔

評論

0/150

提交評論