




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
6.2內(nèi)部變量與外部變量C語(yǔ)言中,將變量的有效范圍稱(chēng)為變量的作用域。所有的變量都有自己的作用域,變量定義的位置不同,其作用域也不同,作用域是從空間角度對(duì)變量特性的一個(gè)描述。按照變量的作用域,將C語(yǔ)言中的變量分為內(nèi)部變量和外部變量。6.2.1內(nèi)部變量1.內(nèi)部變量的概念和定義在一個(gè)函數(shù)(包括main()函數(shù))內(nèi)部或復(fù)合句內(nèi)部定義的變量稱(chēng)為內(nèi)部變量,自然,函數(shù)的形參屬于內(nèi)部變量。內(nèi)部變量只在該函數(shù)范圍內(nèi)或該復(fù)合句范圍內(nèi)有效。也就是說(shuō),內(nèi)部變量的作用域局限于定義它的函數(shù)或復(fù)合句內(nèi)部,在此函數(shù)之外或此復(fù)合句之外就不能使用這些變量了。所以,內(nèi)部變量也稱(chēng)局部變量。
前面我們使用的所有變量都屬于內(nèi)部變量,例如,95頁(yè)【例6.10】中,void()函數(shù)中定義的變量i,其作用域局限于void()函數(shù)內(nèi),在main()函數(shù)中無(wú)效;main()函數(shù)中定義的變量i也只在main()函數(shù)內(nèi)有效.再如:96頁(yè),fun1()函數(shù)中定義的變量p1,p2,p3,其作用域局限于fun1()函數(shù)內(nèi),在main()函數(shù)中無(wú)效;fun2()函數(shù)中定義的變量p4,p5,p6,其作用域局限于fun2()函數(shù)內(nèi),在main()函數(shù)中無(wú)效;main()函數(shù)中定義的變量x,y,a,b也只在main()函數(shù)內(nèi)有效.if(num1>num2){inttemp;temp=num1;num1=num2;num2=temp;}if(num2>num3){inttemp;temp=num2;num2=num3;num3=temp;}if(num1>num2){inttemp;temp=num1;num1=num2;num2=temp;}printf("Threenumbersaftersorted:%d,%d,%d\n",num1,num2,num3);}程序運(yùn)行情況如下:Pleaseinputthreenumbers:8,0,5↙Threenumbersaftersorted:0,5,8本例中的temp變量的作用域局限于復(fù)合句內(nèi)。6.2.2外部變量1.外部變量的概念和定義在函數(shù)外部定義的變量稱(chēng)為外部變量。外部變量不屬于任何一個(gè)函數(shù),其作用域是:從外部變量的定義位置開(kāi)始,到本源文件結(jié)束為止。外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱(chēng)全局變量。例如97頁(yè)例題中a,b存儲(chǔ)類(lèi)別就是外部型說(shuō)明:(1)在同一源文件中,允許外部變量和內(nèi)部變量同名。同名時(shí)在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用,如下例所示?!纠?.6】外部變量與內(nèi)部變量同名舉例。inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;returnc;}
從本例可以看出,外部變量與內(nèi)部變量同名時(shí)容易混淆其作用域,因此在程序設(shè)計(jì)中應(yīng)盡量避免其同名。(2)外部變量的作用域是從定義點(diǎn)開(kāi)始到本源文件結(jié)束為止的。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量,則需要在函數(shù)內(nèi)對(duì)被引用的外部變量進(jìn)行聲明。外部變量聲明的一般形式為extern類(lèi)型名外部變量[,外部變量2…];可通過(guò)對(duì)外部變量的聲明將其作用域延伸到定義它的位置之前的函數(shù)中。
外部變量的定義和外部變量的聲明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的聲明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。外部變量在定義時(shí)分配內(nèi)存單元,并可以初始化;外部變量聲明時(shí),不能再賦初值,只是表明在該函數(shù)內(nèi)要使用這些外部變量。如97頁(yè)例題中b,c是外部變量的定義,d,e是外部變量的說(shuō)明。
6.2.4內(nèi)部函數(shù)和外部函數(shù)
函數(shù)在本質(zhì)上是全局的,因?yàn)橐粋€(gè)函數(shù)需要被其他函數(shù)調(diào)用。那么,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),在一個(gè)源文件中定義的函數(shù),能否被其他源文件中的函數(shù)調(diào)用呢?C語(yǔ)言根據(jù)函數(shù)能否被其他源文件中的函數(shù)調(diào)用,將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。static類(lèi)型名函數(shù)名(參數(shù)定義表){函數(shù)體}
關(guān)鍵字static譯成中文就是“靜態(tài)的”,所以,內(nèi)部函數(shù)又稱(chēng)靜態(tài)函數(shù)。但此處,static的含義不是指存儲(chǔ)方式,而是指函數(shù)的作用域僅局限于本源文件內(nèi)。使用內(nèi)部函數(shù)的好處是:不同的人編寫(xiě)不同的函數(shù)時(shí),不用擔(dān)心自己定義的函數(shù),是否會(huì)與其他源文件中的函數(shù)同名。外部函數(shù)1.外部函數(shù)的概念如果在一個(gè)源文件中定義的函數(shù),除可被本源文件中的其他函數(shù)調(diào)用外,也可被其他源文件中的函數(shù)所調(diào)用,則這種函數(shù)稱(chēng)為外部函數(shù)。外部函數(shù)的作用域是整個(gè)源程序。2.外部函數(shù)的定義在定義函數(shù)時(shí),如果沒(méi)有加關(guān)鍵字static,或冠以關(guān)鍵字extern,表示此函數(shù)是外部函數(shù),如下所示:[extern]類(lèi)型名函數(shù)名(參數(shù)定義表){函數(shù)體}與調(diào)用本源文件中的函數(shù)一樣,需要對(duì)被調(diào)用的外部函數(shù)進(jìn)行如下聲明:[extern]類(lèi)型名函數(shù)名(參數(shù)類(lèi)型表)[,函數(shù)名2(參數(shù)類(lèi)型表2)…];6.3變量的動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)6.3.1動(dòng)態(tài)存儲(chǔ)與靜態(tài)存儲(chǔ)的概念在C語(yǔ)言中,每個(gè)變量都有兩個(gè)屬性:數(shù)據(jù)類(lèi)型和存儲(chǔ)類(lèi)型。存儲(chǔ)類(lèi)型是指變量在內(nèi)存中存儲(chǔ)的方式。各種變量的作用域不同,就其本質(zhì)來(lái)說(shuō)是因?yàn)樽兞康拇鎯?chǔ)類(lèi)型不同。變量的存儲(chǔ)類(lèi)型分為靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)兩大類(lèi)。由此可知,靜態(tài)存儲(chǔ)變量是一直存在的,而動(dòng)態(tài)存儲(chǔ)變量則時(shí)而存在、時(shí)而消失。這種由于變量存儲(chǔ)方式的不同而產(chǎn)生的特性,稱(chēng)為變量的生存期。生存期表示了變量存在的時(shí)間。生存期和作用域分別從時(shí)間和空間這兩個(gè)不同的角度描述了變量的特性。這兩者既有聯(lián)系,又有區(qū)別。一個(gè)變量究竟屬于哪一種存儲(chǔ)方式,并不能僅從其作用域來(lái)判斷,還應(yīng)有明確的存儲(chǔ)類(lèi)型定義。因此,變量定義的完整形式應(yīng)為[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型變量名[,變量名2…];
在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類(lèi)型定義有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)和靜態(tài)內(nèi)部變量(static)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)方式。對(duì)一個(gè)變量的定義,不僅應(yīng)定義其數(shù)據(jù)類(lèi)型,還應(yīng)定義其存儲(chǔ)類(lèi)型。static數(shù)據(jù)類(lèi)型內(nèi)部變量表;存儲(chǔ)特點(diǎn):(1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ),是在編譯時(shí)為其分配存儲(chǔ)單元的,其生存期為整個(gè)程序執(zhí)行期間。在程序執(zhí)行過(guò)程中,即使所在函數(shù)被調(diào)用結(jié)束也不釋放,一直存在。但其他函數(shù)不能引用它們。(2)靜態(tài)內(nèi)部變量是在編譯時(shí)賦初值的,若定義而不初始化,則自動(dòng)賦以0(整型和實(shí)型)或\0(字符型),也即系統(tǒng)會(huì)自動(dòng)初始化為0值。每次調(diào)用靜態(tài)內(nèi)部變量所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值,如99頁(yè)例題所示?!纠?.7】輸出1~4的階乘。longfactorial(intn){registerlongi,fact=1;/*定義寄存器變量*/for(i=1;i<=n;i++)fact*=i;return(fact);}main(){intnum;for(num=1;num<=4;num++)printf("%d!=%ld\n",num,factorial(num));}程序運(yùn)行結(jié)果如下:1!=12!=23!=64!=246.3預(yù)處理程序6.3.1文件包含文件包含是C語(yǔ)言預(yù)處理程序的一個(gè)重要功能。其命令行的一般形式為#include"文件名"或#include<文件名>以前已多次用此命令包含過(guò)TurboC庫(kù)函數(shù)的頭文件。例如:#include"stdio.h"及#include"math.h"說(shuō)明:(1)包含命令中的文件名可以用雙引號(hào)括起來(lái),也可以用尖括號(hào)括起來(lái)。如“#include”stdio.h“”或“#include<math.h>”。但是這兩種形式是有區(qū)別的:使用尖括號(hào)表示在包含文件目錄中去查找(包含目錄是由用戶在設(shè)置環(huán)境時(shí)設(shè)置的),而不在源文件目錄去查找;使用雙引號(hào)則表示首先在當(dāng)前的源文件目錄中查找,若未找到才到包含目錄中去查找。用戶編程時(shí)可根據(jù)自己文件所在的目錄來(lái)選擇某一種命令形式。(2)一個(gè)include命令只能指定一個(gè)被包含文件,若有多個(gè)文件要包含,則需用多個(gè)include命令。(3)文件包含允許嵌套,即在一個(gè)被包含的文件中又可以包含另一個(gè)文件。6.3.2宏替換在C語(yǔ)言源程序中,允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱(chēng)為“宏”。被定義為“宏”的標(biāo)識(shí)符稱(chēng)為“宏名”。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱(chēng)為“宏代換”或“宏展開(kāi)”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動(dòng)完成的。宏提供了一種詞法符號(hào)替換機(jī)制,它們可帶也可不帶類(lèi)似函數(shù)參數(shù)的形式參數(shù)。#define指令定義宏。說(shuō)明:
1)根據(jù)一般C語(yǔ)言程序中變量的命名規(guī)則,符號(hào)常量的定義一般習(xí)慣使用大寫(xiě)字母表示,這主要是因?yàn)橥ǔT谝话阕兞康亩x中,常使用小寫(xiě)字母的原因。當(dāng)然,符號(hào)常量也可以小寫(xiě)字母命名2)宏定義是用宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名,屬于一種簡(jiǎn)單的代換。3)宏定義常用于程序中反復(fù)使用的表達(dá)式4)宏定義必須寫(xiě)在函數(shù)之外,其作用域?yàn)楹甓x命令起到源程序結(jié)束。如要終止其作用域,可使用#undef命令。例如:#definePI3.14159main(){}#undef/*終止PI的作用域*/f1()利用#undef后,使得PI只在main函數(shù)中有效,在f1()函數(shù)中無(wú)效。帶參數(shù)宏定義C語(yǔ)言允許宏帶有參數(shù)。在宏定義中的參數(shù)稱(chēng)為形式參數(shù),在宏調(diào)用中的參數(shù)稱(chēng)為實(shí)際參數(shù)。對(duì)帶參數(shù)的宏,在調(diào)用中,不僅要宏展開(kāi),而且要用實(shí)參去代換形參。帶參宏定義的一般形式為#define宏名(形參表)字符串其中,在字符串中含有各個(gè)形參。帶參數(shù)宏調(diào)用的一般形式為宏名(實(shí)參表);例如:#defineM(y)y*y+3*y/*宏定義*/
k=M(5); /*宏調(diào)用*/在宏調(diào)用時(shí),用實(shí)參5去代替形參y,經(jīng)預(yù)處理宏展開(kāi)后的語(yǔ)句為k=5*5+3*5;【例6.8】/*程序功能:帶參宏示例,實(shí)現(xiàn)自鍵盤(pán)輸入兩個(gè)數(shù)值的比較并輸出較大值*/#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;printf("inputtwonumbers:");scanf("%d%d",&x,&y);
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年新進(jìn)廠員工安全培訓(xùn)考試試題含答案【典型題】
- 2024-2025公司、項(xiàng)目部、各個(gè)班組三級(jí)安全培訓(xùn)考試試題含答案【能力提升】
- 幼兒園勞動(dòng)節(jié)安全教育
- 蔬菜寶寶中班健康教案
- 北師大版初中數(shù)學(xué)說(shuō)課課件
- 2025年中國(guó)滴定管夾市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)測(cè)網(wǎng)表市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)成人山羊市場(chǎng)調(diào)查研究報(bào)告
- 2025年中國(guó)工藝盆市場(chǎng)調(diào)查研究報(bào)告
- DB3305T 324-2024生態(tài)文明典范城市標(biāo)準(zhǔn)體系編制指南
- 兒童抑郁量表CDI
- 馬克思主義新聞?dòng)^十二講之第八講堅(jiān)持新聞?wù)鎸?shí)原則課件
- 工藝管道伴熱管施工技術(shù)方案
- 各層次養(yǎng)老機(jī)構(gòu)定價(jià)方法及案例
- 二方審核計(jì)劃
- 優(yōu)秀病例演講比賽PPT
- 吉林省礦產(chǎn)資源概況及分布
- 最新肺結(jié)核診斷和治療指南
- 公司員工基本禮儀培訓(xùn)ppt完整版課件
- 工程項(xiàng)目綜合應(yīng)急預(yù)案(通用版)
- 半橋LLC諧振變換器設(shè)計(jì)與仿真
評(píng)論
0/150
提交評(píng)論