




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++程序的結(jié)構(gòu)1變量的作用域和生存期
1、作用域和生存期的基本概念
變量的作用域即變量的作用范圍(或有效范圍)。表現(xiàn)為變量有的可以在整個(gè)程序或其它程序中進(jìn)行引用,有的則只能在局部范圍內(nèi)引用。按其作用域范圍可分為兩種:即局部變量和全局變量
變量的生存期變量從被生成到被撤消的這段時(shí)間。實(shí)際上就是變量占用內(nèi)存的時(shí)間。
按其生存期可分為兩種:即動(dòng)態(tài)變量和靜態(tài)變量
變量只能在其生存期內(nèi)被引用,變量的作用域直接影響變量的生存期。作用域和生存期是從空間和時(shí)間的角度來(lái)體現(xiàn)變量的特性。
2、局部變量作用域和生存期
定義在函數(shù)內(nèi)作定義說(shuō)明的變量,也稱(chēng)為內(nèi)部變量
。
作用域僅限于函數(shù)內(nèi),離開(kāi)函數(shù)后不可再引用。
生存期從函數(shù)被調(diào)用的時(shí)刻到函數(shù)返回調(diào)用處的時(shí)刻(靜態(tài)局部變量除外)。intf1(intx,inty){
intz;z=x>y?x:y;return(z);}voidf2(){cout<<z<<endl);}局部變量
變量x、y、z的作用域引用錯(cuò)誤!
說(shuō)明(1)主函數(shù)main()中定義的變量也是局部變量,它只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的局部變量。
intf3(intx);voidmain(){inta=2,b;b=a+y;
cout<<b
<<endl;}intf3(intx){inty;y=a+5;return(y);}局部變量
變量a、b的作用域變量x、y的作用域局部變量
錯(cuò)誤!錯(cuò)誤!
說(shuō)明(2)形參變量屬于被調(diào)用函數(shù)的局部變量;實(shí)參變量則屬于全局變量或調(diào)用函數(shù)的局部變量。
(3)允許在不同的函數(shù)中使用相同的變量名,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。#include<iostream>usingnamespacestd;voidsubf();voidmain(){
inta,b;
a=3,b=4;cout<<"main:a="<<a<<",b="<<b<<endl;subf();cout<<"main:a="<<a<<",b="<<b<<endl;}voidsubf(){inta,b;a=6,b=7;cout<<"main:a="<<a<<",b="<<b<<endl;}運(yùn)行結(jié)果:main:a=3,b=4subf:a=6,b=7main:a=3,b=4變量名相同
說(shuō)明(4)在復(fù)合語(yǔ)句中定義的變量也是局部變量,其作用域只在復(fù)合語(yǔ)句范圍內(nèi)。其生存期是從復(fù)合語(yǔ)句被執(zhí)行的時(shí)刻到復(fù)合語(yǔ)句執(zhí)行完畢的時(shí)刻。
#include<iostream>usingnamespacestd;
voidmain(){
inta=2,b=4;
{intk,b;k=a+5;b=a*5;cout<<"k="<<k<<endl;cout<<"b="<<b<<endl;}cout<<"b="<<b<<endl;a=k+2;}main中的局部變量
復(fù)合語(yǔ)句中的局部變量
main中變量a、b的作用域
復(fù)合語(yǔ)句中變量k、b的作用域輸出k=7
輸出b=10
輸出b=4
錯(cuò)誤!3、全局變量作用域和生存期
定義在函數(shù)外部作定義說(shuō)明的變量,也稱(chēng)為外部變量
。它不屬于哪一個(gè)函數(shù),而屬于一個(gè)源程序文件。
作用域從定義變量的位置開(kāi)始到本源文件結(jié)束,及有extern說(shuō)明的其它源文件。
生存期與程序相同。即從程序開(kāi)始執(zhí)行到程序終止的這段時(shí)間內(nèi),全局變量都有效。
#include<iostream>#include<cmath>usingnamespacestd;intsign();//計(jì)算數(shù)n的平方根floatsqr(){if(n>0)return(sqrt(n));elsereturn(-1);}floatn=0;voidmain(){ints;floatt;cin>>n;s=sign();//取符號(hào)
t=sqr();//取平方根
cout<<"s=“<<s<<",t="<<t<<endl;}//取數(shù)n的符號(hào)intsign(){intr=0;if(n>0)r=1;if(n<0)r=-1;return(r);}定義全局變量,并賦初值局部變量全局變量n的作用域
局部變量s、t的作用域局部變量局部變量r的作用域錯(cuò)誤!
說(shuō)明(1)應(yīng)盡量少使用全局變量。
全局變量在程序全部執(zhí)行過(guò)程中始終占用存儲(chǔ)單元降低了函數(shù)的獨(dú)立性、通用性、可靠性及可移植性降低程序清晰性,容易出錯(cuò)(2)若外部變量與局部變量同名,則外部變量被屏蔽。要引用全局變量,則必須在變量名前加上兩個(gè)冒號(hào)“::”
#include<iostream>usingnamespacestd;
inta=10;
//全局變量voidmain(){
inta=100;
//局部變量(與全局變量同名)
cout<<"locala="<<a<<endl;cout<<"globala="<<::a<<endl;}運(yùn)行結(jié)果:locala=100globala=10
注意:局部變量與全局變量同名極易導(dǎo)致程序員犯邏輯錯(cuò)誤。
說(shuō)明(3)全局變量定義必須在所有的函數(shù)之外,且只能定義一次,并可賦初始值。全局變量定義的一般形式為:
[extern]類(lèi)型說(shuō)明符全局變量名1[=初始值1],……,全局變量名n[=初始值n];可缺??!charch='Y';voidmain(){……}charch;voidfunc(){……}定義全局變量ch錯(cuò)誤!ch只能定義一次例:inta=2,b=4;externinta=2,b=4;
說(shuō)明(4)對(duì)全局變量進(jìn)行說(shuō)明,可擴(kuò)展全局變量的作用域。全局變量說(shuō)明的一般形式為:extern
類(lèi)型說(shuō)明符全局變量名1,…,全局變量名n;不可缺省!不可賦初值!voidgx(),gy();voidmain(){
externintx,y;
cout<<"1:x="<<x<<",y="<<y<<endl;
y=246;gx();gy();}externintx,y;voidgx(){x=135;
cout<<“2:x="<<x<<",y="<<y<<endl;}intx=0,y=0;voidgy(){
cout<<“3:x="<<x<<",y="<<y<<endl;}全局變量定義未說(shuō)明前的作用域全局變量說(shuō)明說(shuō)明后的作用域全局變量說(shuō)明說(shuō)明后的作用域運(yùn)行結(jié)果:
1:x=0y=02:x=135y=2463:x=135y=246
說(shuō)明(5)全局變量定義與全局變量的說(shuō)明的區(qū)分
externinta;
voidfunc1(){……//引用變量a}externinta=2;
voidfunc2(){……//引用變量a}誰(shuí)是定義?誰(shuí)是說(shuō)明?全局變量定義(因?yàn)橘x了初值)全局變量說(shuō)明
注意:兩者中有且只能有一個(gè)對(duì)變量a賦初始值,不能都對(duì)變量a賦初始值或都不賦值,否則編譯錯(cuò)!
2變量的存儲(chǔ)類(lèi)型
概述
變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象變量的屬性
①數(shù)據(jù)類(lèi)型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)。規(guī)定了它們的取值范圍和可參與的運(yùn)算。
②存儲(chǔ)類(lèi)型:
規(guī)定了變量占用內(nèi)存空間的方式,也稱(chēng)為存儲(chǔ)方式。
存儲(chǔ)器類(lèi)型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)
auto---------自動(dòng)型
register-----寄存器型
static-------靜態(tài)型
extern-------外部型動(dòng)態(tài)存儲(chǔ)靜態(tài)存儲(chǔ)存儲(chǔ)類(lèi)型說(shuō)明符數(shù)據(jù)類(lèi)型說(shuō)明符變量名1,變量名2,…,變量名n;變量定義的完整形式應(yīng)為:
例如:
autocharc1,c2;//c1,c2為自動(dòng)字符變量
registeri;//i為寄存器型變量
staticinta,b;//a,b為靜態(tài)整型變量
externintx,y;//x,y為外部整型變量1、自動(dòng)變量(auto型變量)[auto]數(shù)據(jù)類(lèi)型說(shuō)明符變量名1,變量名2,…,變量名n;
定義格式
說(shuō)明
存儲(chǔ)類(lèi)型說(shuō)明符auto可以省略。自動(dòng)變量只能在函數(shù)內(nèi)或復(fù)合語(yǔ)句中定義,它屬于局部變量。voidfunc(){
inti,j,k;
……}等價(jià)于autointi,j,k;autointk;
voidfunc(){……}錯(cuò)誤!自動(dòng)變量不可定義在函數(shù)外
注意:在函數(shù)外部定義的沒(méi)有帶存儲(chǔ)類(lèi)型說(shuō)明符的全局變量是外部變量,屬于靜態(tài)存儲(chǔ)類(lèi)型。
如:intk;
//k為外部變量,屬靜態(tài)存儲(chǔ)類(lèi)型
voidfunc(){……}2、外部變量(extern型變量)
外部變量和全局變量是對(duì)同一類(lèi)變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量從它的存儲(chǔ)方式提出的,表示了它的生存期。它屬于靜態(tài)存儲(chǔ)類(lèi)型。例:引用其它文件中的外部變量原文件prg1.cppinta,b;
//外部變量定義intmax();//外部函數(shù)聲明voidmain(){intc;
a=4,b=5;c=max();cout<<"max="<<c<<endl;}原文件prg2.cppexterninta,b;
//外部變量說(shuō)明intmax(){return(a>b?a:b);}編譯、鏈接、運(yùn)行運(yùn)行結(jié)果:
max=53、靜態(tài)變量(static型變量)
靜態(tài)變量與靜態(tài)存儲(chǔ)類(lèi)型
靜態(tài)變量的類(lèi)型說(shuō)明符是static。靜態(tài)變量屬于靜態(tài)存儲(chǔ)類(lèi)型。靜態(tài)存儲(chǔ)類(lèi)型的變量不一定就是靜態(tài)變量。例如外部變量雖屬于靜態(tài)存儲(chǔ)類(lèi)型但不一定是靜態(tài)變量,必須由static加以定義后才能成為靜態(tài)外部變量,或稱(chēng)靜態(tài)全局變量。
自動(dòng)變量可以用static定義它為靜態(tài)自動(dòng)變量,或稱(chēng)靜態(tài)局部變量,從而成為靜態(tài)存儲(chǔ)方式。
靜態(tài)局部變量
在局部變量的說(shuō)明前加上static就構(gòu)成靜態(tài)局部變量
例如:
staticinta,b;staticfloatarray[5]={1,2,3,4,5};
靜態(tài)局部變量與自動(dòng)變量之比較
靜態(tài)局部變量與自動(dòng)變量均屬于局部變量
靜態(tài)局部變量生存期長(zhǎng),為整個(gè)源程序。自動(dòng)變量生存期短。靜態(tài)局部變量的生存期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同voidfunc();voidmain()
{inta;a=s+5;……}voidfunc(){staticints;……}定義靜態(tài)局部變量s錯(cuò)誤!s的作用域
靜態(tài)局部變量與自動(dòng)變量之比較
靜態(tài)局部變量若在定義時(shí)未賦初值,則系統(tǒng)自動(dòng)賦初值0
靜態(tài)局部變量賦初值只一次,而自動(dòng)變量賦初值可能多次#include<iostream>usingnamespacestd;voidmain(){inti;voidfunc();//函數(shù)說(shuō)明
for(i=1;i<=5;i++)func();//函數(shù)調(diào)用}voidfunc()//函數(shù)定義{
autointj=0;++j;cout<<"\t"<<j;}#include<iostream>usingnamespacestd;voidmain(){inti;voidfunc();//函數(shù)說(shuō)明
for(i=1;i<=5;i++)func();//函數(shù)調(diào)用}voidfunc()//函數(shù)定義{
staticintj=0;++j;
cout<<"\t"<<j;}自動(dòng)變量靜態(tài)變量運(yùn)行結(jié)果:11111
運(yùn)行結(jié)果:12345
靜態(tài)全局變量
全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)全局變量。全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量可通過(guò)外部變量說(shuō)明使其在整個(gè)源程序中都有效。而靜態(tài)全局變量只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能通過(guò)外部變量說(shuō)明來(lái)使用它。
prg1.cpp
inta,b;staticcharch;
voidmain(){……}
prg2.cpp
externinta,b;externcharch;
intfunc(intx,inty){……}
外部(全局)變量定義靜態(tài)全局變量定義錯(cuò)誤!4、寄存器變量(register型變量)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- LED燈具采購(gòu)協(xié)議
- 2025年吉林省松原市寧江區(qū)中考物理一模自編練習(xí)試卷(一)(含解析)
- 鐵路市場(chǎng)營(yíng)銷(xiāo)市場(chǎng)營(yíng)銷(xiāo)發(fā)展的新趨勢(shì)75課件
- 農(nóng)村建房實(shí)際施工方案
- 鐵路信號(hào)與通信設(shè)備接發(fā)列車(chē)工作89課件
- 《GB 14622-2016摩托車(chē)污染物排放限值及測(cè)量方法(中國(guó)第四階段)》(2025版)深度解析
- 中國(guó)中醫(yī)發(fā)展史
- 購(gòu)房合同書(shū)范本
- 民辦萬(wàn)博科技職業(yè)學(xué)院《主要英語(yǔ)國(guó)家國(guó)情》2023-2024學(xué)年第二學(xué)期期末試卷
- 交易居間協(xié)議合同范本
- 2024年湖北省中考滿(mǎn)分作文《滿(mǎn)樹(shù)繁花》
- 2025年江蘇省蘇州市中考模擬英語(yǔ)試題(二)(原卷版+解析版)
- 廈門(mén)大學(xué)·DeepSeek手冊(cè)3 -DeepSeek大模型及其企業(yè)應(yīng)用實(shí)踐:企業(yè)人員的大模型寶典
- 煙草考試筆試試題及答案
- 上海第二工業(yè)大學(xué)模板
- 2022-2023學(xué)年浙江省金華市義烏市部編版六年級(jí)下冊(cè)期末考試語(yǔ)文試卷(原卷版+解析)
- DB65-T 4863-2024 超設(shè)計(jì)使用年限壓力容器安全評(píng)估規(guī)則
- DBJ50-T-284-2018 工程勘察信息模型設(shè)計(jì)標(biāo)準(zhǔn)
- 相鄰企業(yè)同廠區(qū)企業(yè)間安全管理協(xié)議書(shū)范本
- 煤礦管理人員事故隱患排查治理專(zhuān)項(xiàng)培訓(xùn)課件
- 2024年重慶高考物理卷試題真題解讀及答案詳解(精校打?。?/a>
評(píng)論
0/150
提交評(píng)論