课件-第05章5程序结构_第1页
课件-第05章5程序结构_第2页
课件-第05章5程序结构_第3页
课件-第05章5程序结构_第4页
课件-第05章5程序结构_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序的结构1变量的作用域和生存期

1、作用域和生存期的基本概念

变量的作用域即变量的作用范围(或有效范围)。表现为变量有的可以在整个程序或其它程序中进行引用,有的则只能在局部范围内引用。按其作用域范围可分为两种:即局部变量和全局变量

变量的生存期变量从被生成到被撤消的这段时间。实际上就是变量占用内存的时间。

按其生存期可分为两种:即动态变量和静态变量

变量只能在其生存期内被引用,变量的作用域直接影响变量的生存期。作用域和生存期是从空间和时间的角度来体现变量的特性。

2、局部变量作用域和生存期

定义在函数内作定义说明的变量,也称为内部变量

作用域仅限于函数内,离开函数后不可再引用。

生存期从函数被调用的时刻到函数返回调用处的时刻(静态局部变量除外)。intf1(intx,inty){

intz;z=x>y?x:y;return(z);}voidf2(){cout<<z<<endl);}局部变量

变量x、y、z的作用域引用错误!

说明(1)主函数main()中定义的变量也是局部变量,它只能在主函数中使用,其它函数不能使用。同时,主函数中也不能使用其它函数中定义的局部变量。

intf3(intx);voidmain(){inta=2,b;b=a+y;

cout<<b

<<endl;}intf3(intx){inty;y=a+5;return(y);}局部变量

变量a、b的作用域变量x、y的作用域局部变量

错误!错误!

说明(2)形参变量属于被调用函数的局部变量;实参变量则属于全局变量或调用函数的局部变量。

(3)允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。#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;}运行结果:main:a=3,b=4subf:a=6,b=7main:a=3,b=4变量名相同

说明(4)在复合语句中定义的变量也是局部变量,其作用域只在复合语句范围内。其生存期是从复合语句被执行的时刻到复合语句执行完毕的时刻。

#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中的局部变量

复合语句中的局部变量

main中变量a、b的作用域

复合语句中变量k、b的作用域输出k=7

输出b=10

输出b=4

错误!3、全局变量作用域和生存期

定义在函数外部作定义说明的变量,也称为外部变量

。它不属于哪一个函数,而属于一个源程序文件。

作用域从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件。

生存期与程序相同。即从程序开始执行到程序终止的这段时间内,全局变量都有效。

#include<iostream>#include<cmath>usingnamespacestd;intsign();//计算数n的平方根floatsqr(){if(n>0)return(sqrt(n));elsereturn(-1);}floatn=0;voidmain(){ints;floatt;cin>>n;s=sign();//取符号

t=sqr();//取平方根

cout<<"s=“<<s<<",t="<<t<<endl;}//取数n的符号intsign(){intr=0;if(n>0)r=1;if(n<0)r=-1;return(r);}定义全局变量,并赋初值局部变量全局变量n的作用域

局部变量s、t的作用域局部变量局部变量r的作用域错误!

说明(1)应尽量少使用全局变量。

全局变量在程序全部执行过程中始终占用存储单元降低了函数的独立性、通用性、可靠性及可移植性降低程序清晰性,容易出错(2)若外部变量与局部变量同名,则外部变量被屏蔽。要引用全局变量,则必须在变量名前加上两个冒号“::”

#include<iostream>usingnamespacestd;

inta=10;

//全局变量voidmain(){

inta=100;

//局部变量(与全局变量同名)

cout<<"locala="<<a<<endl;cout<<"globala="<<::a<<endl;}运行结果:locala=100globala=10

注意:局部变量与全局变量同名极易导致程序员犯逻辑错误。

说明(3)全局变量定义必须在所有的函数之外,且只能定义一次,并可赋初始值。全局变量定义的一般形式为:

[extern]类型说明符全局变量名1[=初始值1],……,全局变量名n[=初始值n];可缺省!charch='Y';voidmain(){……}charch;voidfunc(){……}定义全局变量ch错误!ch只能定义一次例:inta=2,b=4;externinta=2,b=4;

说明(4)对全局变量进行说明,可扩展全局变量的作用域。全局变量说明的一般形式为:extern

类型说明符全局变量名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;}全局变量定义未说明前的作用域全局变量说明说明后的作用域全局变量说明说明后的作用域运行结果:

1:x=0y=02:x=135y=2463:x=135y=246

说明(5)全局变量定义与全局变量的说明的区分

externinta;

voidfunc1(){……//引用变量a}externinta=2;

voidfunc2(){……//引用变量a}谁是定义?谁是说明?全局变量定义(因为赋了初值)全局变量说明

注意:两者中有且只能有一个对变量a赋初始值,不能都对变量a赋初始值或都不赋值,否则编译错!

2变量的存储类型

概述

变量是对程序中数据的存储空间的抽象变量的属性

①数据类型:变量所持有的数据的性质(操作属性)。规定了它们的取值范围和可参与的运算。

②存储类型:

规定了变量占用内存空间的方式,也称为存储方式。

存储器类型:寄存器、静态存储区、动态存储区

auto---------自动型

register-----寄存器型

static-------静态型

extern-------外部型动态存储静态存储存储类型说明符数据类型说明符变量名1,变量名2,…,变量名n;变量定义的完整形式应为:

例如:

autocharc1,c2;//c1,c2为自动字符变量

registeri;//i为寄存器型变量

staticinta,b;//a,b为静态整型变量

externintx,y;//x,y为外部整型变量1、自动变量(auto型变量)[auto]数据类型说明符变量名1,变量名2,…,变量名n;

定义格式

说明

存储类型说明符auto可以省略。自动变量只能在函数内或复合语句中定义,它属于局部变量。voidfunc(){

inti,j,k;

……}等价于autointi,j,k;autointk;

voidfunc(){……}错误!自动变量不可定义在函数外

注意:在函数外部定义的没有带存储类型说明符的全局变量是外部变量,属于静态存储类型。

如:intk;

//k为外部变量,属静态存储类型

voidfunc(){……}2、外部变量(extern型变量)

外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量从它的存储方式提出的,表示了它的生存期。它属于静态存储类型。例:引用其它文件中的外部变量原文件prg1.cppinta,b;

//外部变量定义intmax();//外部函数声明voidmain(){intc;

a=4,b=5;c=max();cout<<"max="<<c<<endl;}原文件prg2.cppexterninta,b;

//外部变量说明intmax(){return(a>b?a:b);}编译、链接、运行运行结果:

max=53、静态变量(static型变量)

静态变量与静态存储类型

静态变量的类型说明符是static。静态变量属于静态存储类型。静态存储类型的变量不一定就是静态变量。例如外部变量虽属于静态存储类型但不一定是静态变量,必须由static加以定义后才能成为静态外部变量,或称静态全局变量。

自动变量可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。

静态局部变量

在局部变量的说明前加上static就构成静态局部变量

例如:

staticinta,b;staticfloatarray[5]={1,2,3,4,5};

静态局部变量与自动变量之比较

静态局部变量与自动变量均属于局部变量

静态局部变量生存期长,为整个源程序。自动变量生存期短。静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同voidfunc();voidmain()

{inta;a=s+5;……}voidfunc(){staticints;……}定义静态局部变量s错误!s的作用域

静态局部变量与自动变量之比较

静态局部变量若在定义时未赋初值,则系统自动赋初值0

静态局部变量赋初值只一次,而自动变量赋初值可能多次#include<iostream>usingnamespacestd;voidmain(){inti;voidfunc();//函数说明

for(i=1;i<=5;i++)func();//函数调用}voidfunc()//函数定义{

autointj=0;++j;cout<<"\t"<<j;}#include<iostream>usingnamespacestd;voidmain(){inti;voidfunc();//函数说明

for(i=1;i<=5;i++)func();//函数调用}voidfunc()//函数定义{

staticintj=0;++j;

cout<<"\t"<<j;}自动变量静态变量运行结果:11111

运行结果:12345

静态全局变量

全局变量(外部变量)的说明之前再冠以static就构成了静态全局变量。全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。当一个源程序由多个源文件组成时,非静态的全局变量可通过外部变量说明使其在整个源程序中都有效。而静态全局变量只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能通过外部变量说明来使用它。

prg1.cpp

inta,b;staticcharch;

voidmain(){……}

prg2.cpp

externinta,b;externcharch;

intfunc(intx,inty){……}

外部(全局)变量定义静态全局变量定义错误!4、寄存器变量(register型变量)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论