收藏 分销(赏)

函数的定义和调用省公共课一等奖全国赛课获奖课件.pptx

上传人:精**** 文档编号:4149055 上传时间:2024-08-02 格式:PPTX 页数:38 大小:188.64KB 下载积分:12 金币
下载 相关 举报
函数的定义和调用省公共课一等奖全国赛课获奖课件.pptx_第1页
第1页 / 共38页
函数的定义和调用省公共课一等奖全国赛课获奖课件.pptx_第2页
第2页 / 共38页


点击查看更多>>
资源描述
C+程序设计程序设计第第3章章(1)函数定义和调用函数定义和调用1第1页主要内容主要内容l函数概述函数概述l函数定义函数定义l函数调用和返回函数调用和返回l函数参数传递函数参数传递值传递值传递l函数参数传递函数参数传递引用传递引用传递l函数原型申明函数原型申明l全局变量及其作用域全局变量及其作用域l局部变量及其作用域局部变量及其作用域lC+程序内存布局程序内存布局l标识符作用域标识符作用域块作用域、文件作用域、函数原型作用域、函数作用域块作用域、文件作用域、函数原型作用域、函数作用域l变量存放类型和生存期变量存放类型和生存期l函数调用机制函数调用机制2第2页函数概述函数概述l关于关于C+函数:函数:C+程序结构化特点:程序结构化特点:就是整个程序由一个或多个函数组成,每个函数含有相对独立就是整个程序由一个或多个函数组成,每个函数含有相对独立功效,函数之间有显著界面,程序整体含有清楚模块结构,易于修改。功效,函数之间有显著界面,程序整体含有清楚模块结构,易于修改。C+函数有两大类:函数有两大类:一类是系统预定义,称为库函数或标准函数,这些库函数按照不一类是系统预定义,称为库函数或标准函数,这些库函数按照不一样功效进行分类,集中定义在不一样头文件中,用户只要在自己程序中包含某个一样功效进行分类,集中定义在不一样头文件中,用户只要在自己程序中包含某个头文件,就可直接使用该头文件中定义函数。另一类是用户自定义函数,用户能够头文件,就可直接使用该头文件中定义函数。另一类是用户自定义函数,用户能够依据需要将程序中某个含有相对独立功效程序段定义为函数。依据需要将程序中某个含有相对独立功效程序段定义为函数。C+程序基本模块:程序基本模块:就是函数,任何一个就是函数,任何一个C+程序均由若干个函数组成,其中有且仅程序均由若干个函数组成,其中有且仅有一个主函数,它是程序执行入口函数,有一个主函数,它是程序执行入口函数,VC+控制台编程是由用户定义控制台编程是由用户定义main()作为作为入口函数,入口函数,Windows编程是由编译器定义编程是由编译器定义WinMain()作为入口函数。作为入口函数。3第3页函数概述函数概述 C+函数之间是并列平等关系,在程序中定义位置任意,一个函数能够调用其它函数,函数之间是并列平等关系,在程序中定义位置任意,一个函数能够调用其它函数,也能够被其它函数所调用,但主函数只能调用其它函数,而不能被调用。也能够被其它函数所调用,但主函数只能调用其它函数,而不能被调用。函数定义并列关系函数定义并列关系 函数调用层次关系函数调用层次关系void f1()f1函数体函数体 void f2()f2函数体函数体 void main()main函数体函数体 void f3()f3函数体函数体 void f4()f4函数体函数体 void f5()f5函数体函数体 main()f1()f2()f3()f4()f6()4第4页函数定义函数定义l函数定义函数定义:格式:格式:返回值类型返回值类型 函数名函数名 (类型类型1 形参形参1,类型类型2 形参形参2,类型类型n 形参形参n )语句序列语句序列 说明:说明:返回值类型返回值类型能够是能够是C+中任意基本数据类型、已定义结构数据类型;中任意基本数据类型、已定义结构数据类型;若函数没有返回值,则返回值类型定义为若函数没有返回值,则返回值类型定义为 void 型;型;若函数返回值类型省略,表示返回值类型为若函数返回值类型省略,表示返回值类型为 int 型。型。函数体函数体函数头函数头5第5页函数定义函数定义 函数名函数名按标识符命名规则命名,其后括号内定义是函数形式参数;按标识符命名规则命名,其后括号内定义是函数形式参数;若该函数为无参函数,括号内若该函数为无参函数,括号内 void 通常省略不写,但括号不能省略!通常省略不写,但括号不能省略!形式参数表形式参数表列出全部形式参数数据类型、参数名称;列出全部形式参数数据类型、参数名称;各参数即使类型相同,也必须分别进行类型说明;各参数即使类型相同,也必须分别进行类型说明;形参类型能够是形参类型能够是C+中任意基本数据类型、已定义结构数据类型。中任意基本数据类型、已定义结构数据类型。l函数参数作用:函数参数作用:函数调用时,主调函数经过参数将数据传递给被调函数。函数调用时,主调函数经过参数将数据传递给被调函数。l函数返回值作用:函数返回值作用:函数返回时,被调函数可将一个确定值带回到主调函数。函数返回时,被调函数可将一个确定值带回到主调函数。若函数有返回值,则若函数有返回值,则 return语句格式为:语句格式为:return 表示式表示式;且且 return 后面表示式值类型必须与函数返回值类型相匹配!后面表示式值类型必须与函数返回值类型相匹配!若函数无返回值,则返回值类型定义为若函数无返回值,则返回值类型定义为void,且,且return语句格式为:语句格式为:return ;6第6页函数调用和返回函数调用和返回l函数调用函数调用:格式:格式:函数名函数名 (实参实参1,实参实参2,实参实参n )调用:调用:就是控制从主调函数转去执行被调函数函数体。调用时,系统要将实参值按位就是控制从主调函数转去执行被调函数函数体。调用时,系统要将实参值按位置传递给对应形参,所以,普通情况下实参加形参在个数、排列次序上都必须一一置传递给对应形参,所以,普通情况下实参加形参在个数、排列次序上都必须一一对应,且类型匹配。对应,且类型匹配。l函数返回函数返回:就是控制从被调函数返回到主调函数调用点。返回时,即在被调函数中就是控制从被调函数返回到主调函数调用点。返回时,即在被调函数中执行到执行到 return语句时,若有返回值带回,则先计算语句时,若有返回值带回,则先计算 return语句后面表示式值,并转语句后面表示式值,并转换成所要求返回值类型,此时系统会在内存中建立一个暂时变量,用来存放该返回换成所要求返回值类型,此时系统会在内存中建立一个暂时变量,用来存放该返回值,待主调函数中包含该调用式表示式语句从该暂时变量中取值后,系统便撤消该值,待主调函数中包含该调用式表示式语句从该暂时变量中取值后,系统便撤消该暂时变量。暂时变量。7第7页【例】(定义求三个实数中最大数函数【例】(定义求三个实数中最大数函数max()。)。)#include float max(float x,float y,float z)/要将三个实数传递给要将三个实数传递给max()函数,需定义三个形参。函数,需定义三个形参。float t=yz?y:z;return (xt?x:t);void main()float a,b,c;cout a b c;cout “最大数:最大数:”max(a,b,c)endl;运行:运行:请输入三个实数:请输入三个实数:13 56 -89 最大数:最大数:56main()函数函数调用调用max(13,56,-89)main()函数后续语句函数后续语句函数函数max(13,56,-89)return 56主调函数主调函数被调函数被调函数8第8页函数参数传递函数参数传递l形参加实参:形参加实参:函数定义时,写在函数头部参数表中变量,称为形式参数(形参)。函数定义时,写在函数头部参数表中变量,称为形式参数(形参)。函数调用时,写在调用式参数表中表示式、变量、常量,称为实在参数(实参)函数调用时,写在调用式参数表中表示式、变量、常量,称为实在参数(实参)l形参加实参结合:形参加实参结合:编译时,并不为各函数形参分配存放空间,只有在该函数被调用编译时,并不为各函数形参分配存放空间,只有在该函数被调用时,其形参才占用存放空间,并经过堆栈从主调函数中取得值,这个过程称为形参时,其形参才占用存放空间,并经过堆栈从主调函数中取得值,这个过程称为形参加实参结合,一旦函数调用结束,该函数形参就被撤消。加实参结合,一旦函数调用结束,该函数形参就被撤消。l函数参数传递方式有三种函数参数传递方式有三种:值传递值传递 引用传递引用传递 地址传递地址传递9第9页函数参数传递函数参数传递值传递值传递l值传递:值传递:调用函数进行调用函数进行值传递值传递时,调用式中对应时,调用式中对应实参能够是常量、变量、表示式实参能够是常量、变量、表示式。先计算出各个实参表示式值,并将值赋给对应形参变量,其过程就是赋值,所以,要先计算出各个实参表示式值,并将值赋给对应形参变量,其过程就是赋值,所以,要求实参值类型与形参变量类型求实参值类型与形参变量类型符合赋值兼容符合赋值兼容。因为值传递就是赋值传递,所以是因为值传递就是赋值传递,所以是单向传递单向传递,即实参值传递给形参变量后,若形参变,即实参值传递给形参变量后,若形参变量值发生改变不会影响到对应实参变量。量值发生改变不会影响到对应实参变量。【例】【例】#include void swap(int a,int b )int t=a;a=b;b=t;void main()int x,y ;cout x y;cout “调用前:调用前:x=”x “ty=”y endl;swap(x,y);cout “调用后:调用后:x=”x “ty=”y endl;运行:运行:请输入两个整数:请输入两个整数:58 97 调用前:调用前:x=56 y=97调用后:调用后:x=56 y=9710第10页【例】【例】#include int maxi(int a,int b )return ab?a:b;float maxf(float a,float b )return ab?a:b;void main(void )float x=3.4,y=5.6;char c1=A,c2=B;int i=20,j=30;cout maxi(x,y)t;cout maxf(x,y)t;cout maxi(c1,c2)t;cout maxf(c1,c2)t;cout maxi(i+j,45+y)t;cout maxf(i+j,45+y)endl;运行:运行:5 5.6 66 66 50 55.6float x=3.4 int a=3float y=5.6 int b=5float x=3.4 float a=3.4float y=5.6 float b=5.6char c1=A int a=65char c2=B int b=66char c1=A float a=65char c2=B float b=66表示式表示式 i+j 值值50,int型型 int a=50表示式表示式 45+y 值值50.6,float型型 int b=50表示式表示式 i+j 值值50,int型型 float a=50表示式表示式 45+y 值值50.6,float型型 float b=50.611第11页函数参数传递函数参数传递引用传递引用传递l引用类型:引用类型:是是C+中一个特殊数据类型,中一个特殊数据类型,定义引用类型变量,其本质是给一个已定定义引用类型变量,其本质是给一个已定义变量起一个别名,系统并不为引用类型变量分配内存空间,引用类型变量与其相义变量起一个别名,系统并不为引用类型变量分配内存空间,引用类型变量与其相关联变量使用是同一个内存空间。关联变量使用是同一个内存空间。l引用类型变量定义:引用类型变量定义:格式:格式:&=功效:功效:定义一个引用类型变量,必须同时对其进行初始化,使之与一个已定义过同类定义一个引用类型变量,必须同时对其进行初始化,使之与一个已定义过同类型变量相关联,即给该已定义过变量起一个别名。型变量相关联,即给该已定义过变量起一个别名。【例】【例】#include void main()int x=5 ;int&x1=x;int x2=x;x1+=2;cout “x=”x “tx1=”x1 “tx2=”x2 endl;57xx15x2运行:运行:x=7 x1=7 x2=512第12页函数参数传递函数参数传递引用传递引用传递l引用类型变量能够作为函数形参,以实现参数引用传递。引用类型变量能够作为函数形参,以实现参数引用传递。【例】【例】void swap(int&a,int&b )int t=a;a=b;b=t;l引用传递:引用传递:调用函数时,系统对引用类型形参是调用函数时,系统对引用类型形参是不分配不分配存放空间,其本质是给对应实参变量起一存放空间,其本质是给对应实参变量起一个别名。个别名。进行进行引用传递引用传递时,调用式中对应时,调用式中对应实参只能是变量实参只能是变量。引用传递时传递是变量名,引用类型形参变量与其相关联实参变量使用是同一个存放引用传递时传递是变量名,引用类型形参变量与其相关联实参变量使用是同一个存放空间,若引用类型形参变量值发生改变,其相关联实参变量值也就随之改变,所以空间,若引用类型形参变量值发生改变,其相关联实参变量值也就随之改变,所以是是双向传递双向传递。13第13页【例】(值传递)【例】(值传递)#include void swap(int a,int b )int t=a;a=b;b=t;void main()int x=5,y=10 ;cout “调用前:调用前:x=”x “ty=”y endl;swap(x,y);cout “调用后:调用后:x=”x “ty=”y endl;【例】(引用传递)【例】(引用传递)#include void swap(int&a,int&b )int t=a;a=b;b=t;void main()int x=5,y=10 ;cout “调用前:调用前:x=”x “ty=”y endl;swap(x,y);cout “调用后:调用后:x=”x “ty=”y endl;运行:运行:调用前:调用前:x=5 y=10调用后:调用后:x=10 y=5引用传递:引用传递:main():swap():x a 10 y b 5510运行:运行:调用前:调用前:x=5 y=10调用后:调用后:x=5 y=10值传递:值传递:main():swap():x a 10y b 551051014第14页函数原型申明函数原型申明l函数原型申明:函数原型申明:C+中,把函数定义部分称为函数定义性申明,而把对函数引用性申明称为函数原型中,把函数定义部分称为函数定义性申明,而把对函数引用性申明称为函数原型申明。申明。当函数定义在前、调用在后时,可直接调用;当函数调用在前、定义在后时,在函数当函数定义在前、调用在后时,可直接调用;当函数调用在前、定义在后时,在函数被调用前,必须对被调函数作原型申明,函数原型申明可放在主调函数中,也可放被调用前,必须对被调函数作原型申明,函数原型申明可放在主调函数中,也可放在全部函数之外。在全部函数之外。函数原型申明目标是通知编译系统,该函数返回值类型、参数个数、次序、各参数类函数原型申明目标是通知编译系统,该函数返回值类型、参数个数、次序、各参数类型,方便编译系统对其后该函数调用式是否有效进行语法检验。型,方便编译系统对其后该函数调用式是否有效进行语法检验。l函数原型申明格式:函数原型申明格式:格式格式1:函数头函数头 +末尾加分号末尾加分号 返回值类型返回值类型 函数名函数名 (类型类型1 形参形参1,类型类型2 形参形参2,类型类型n 形参形参n );格式格式2:函数头(去掉形参变量名)函数头(去掉形参变量名)+末尾加分号末尾加分号 返回值类型返回值类型 函数名函数名 (类型类型1 ,类型类型2 ,类型类型n );15第15页【例】(输入一个【例】(输入一个8位二进制数,将其转换为十进制数输出。例:若输入位二进制数,将其转换为十进制数输出。例:若输入11010001,110100012=1(27)+1(26)+0(25)+1(24)+0(23)+0(22)+0(21)+1(20)=20910,输出,输出209。)。)#include void main()double power (double ,int );/power()函数引用性申明,即原型申明函数引用性申明,即原型申明 int value=0,k;char c;cout=0;i-)cin c;if (c=1 )value+=(int)power(2,i);/调用调用power()函数函数 cout “十进制数:十进制数:”value endl;double power(double x,int n)/power()函数定义性申明函数定义性申明 double t=1;while (n-)t*=x;return t;运行:运行:请输入一个请输入一个8位二进制数:位二进制数:11010001 十进制数:十进制数:20916第16页【例】(求【例】(求值,值,arctan(x)用级数计算,直到某项绝对值小于用级数计算,直到某项绝对值小于10-15为止。为止。)#include#include void main()double a,b;double arctan (double x );/arctan()函数引用性申明,即原型申明函数引用性申明,即原型申明 a=16*arctan(1/5.);/调用调用arctan()函数,且假如写成函数,且假如写成1/5,结果就都是,结果就都是0 b=4*arctan(1/239.0);/调用调用arctan()函数,且假如写成函数,且假如写成1/239,结果就都是,结果就都是0 cout “=”(a-b)1e-15 ;i+=2 )sum+=sign*t/i ;t=t*x*x ;sign*=-1 ;return sum;运行:运行:=3.1415917第17页【例】(找出【例】(找出 11999 之间数之间数m,使之满足,使之满足m、m2、m3均为回文数。均为回文数。回文:各位数字左右对称整数。例:回文:各位数字左右对称整数。例:11、112=121、113=1331,则输出,则输出11。)。)分析:从最低位开始,用除分析:从最低位开始,用除10取余方法,依次取出该数各位数字;取余方法,依次取出该数各位数字;按反序重新组成新数,若新数与原数完全相等,则原数为回文。按反序重新组成新数,若新数与原数完全相等,则原数为回文。#include void main()bool symm (int n);/symm()函数引用性申明,即原型申明函数引用性申明,即原型申明 for (int m=11 ;m=999;m+)if (symm(m)&symm(m*m)&symm(m*m*m)cout “m=”m “tm*m=”m*m “tm*m*m=”m*m*m endl;bool symm(int n )/symm()函数功效是判断整数函数功效是判断整数n是否是回文是否是回文 for (int i=n,m=0 ;i!=0 ;i=i/10 )m=m*10+i%10;/m是新构数是新构数 return (m=n );运行:运行:m=11 m*m=121 m*m*m=1331m=101 m*m=10201 m*m*m=1030301m=111 m*m=12321 m*m*m=136763118第18页【例】(求以下公式,【例】(求以下公式,r 和和s 值键盘输入,值键盘输入,SIN(x)用级数计算,计算精度为用级数计算,计算精度为10-3。)。)#include#include void main()double tsin(double);double k,r,s;cout r s;if (r*r=s*s )k=sqrt(tsin(r)*tsin(r)+tsin(s)*tsin(s);else k=tsin(r*s)/2;cout “r=”r “ts=”s “t k=”k=1e-3 ;sign*=-1 )sum+=sign*t/p ;t=t*x*x;i+=2 ;p=p*i*(i-1);return sum;运行:运行:请输入请输入 r 和和 s 值:值:3 1 r=3 s=1 k=0.070437319第19页全局变量及其作用域全局变量及其作用域l关于全局变量:关于全局变量:作用:作用:若程序中某个变量要被多个函数所访问,可将其定义为全局变量。若程序中某个变量要被多个函数所访问,可将其定义为全局变量。全局变量:全局变量:指指定义在函数之外变量。定义在函数之外变量。作用域:作用域:全局变量能够定义在函数外任何位置,一旦在某个位置定义了全局变量,其全局变量能够定义在函数外任何位置,一旦在某个位置定义了全局变量,其后任何函数均能够访问该全局变量。后任何函数均能够访问该全局变量。存放类型:存放类型:全局变量存放在全局数据区(静态区),分配该区时内存自动初始化为全局变量存放在全局数据区(静态区),分配该区时内存自动初始化为0,所以全局变量若不做初始化,其初值为,所以全局变量若不做初始化,其初值为0。生存期:生存期:全局变量在程序开始运行时就在全局区分配,程序运行结束才被释放。全局变量在程序开始运行时就在全局区分配,程序运行结束才被释放。20第20页局部变量及其作用域局部变量及其作用域l关于局部变量:关于局部变量:块概念:块概念:指程序中用花括号指程序中用花括号“”括起来一个程序段,称为一个块。括起来一个程序段,称为一个块。局部变量:局部变量:指定义在函数之内或某个块内变量。指定义在函数之内或某个块内变量。作用域:作用域:局部变量能够定义在块内任何位置,一旦在块内某个位置定义了局部变量,局部变量能够定义在块内任何位置,一旦在块内某个位置定义了局部变量,只能在该块内该位置之后那个区域内才能够访问该局部变量。只能在该块内该位置之后那个区域内才能够访问该局部变量。存放类型:存放类型:auto自动类型局部变量、自动类型局部变量、static静态类型局部变量。静态类型局部变量。auto自动局部变量:自动局部变量:存放在局部数据区(栈区),分配栈区时内存不做初始化,所存放在局部数据区(栈区),分配栈区时内存不做初始化,所以以auto局部变量若不做初始化,其初值不确定。局部变量若不做初始化,其初值不确定。static静态局部变量:静态局部变量:存放在全局数据区(静态区),存放在全局数据区(静态区),分配该区时内存自动初始化为分配该区时内存自动初始化为0,所以,所以static局部变量若不做初始化,其初值为局部变量若不做初始化,其初值为0。21第21页C+程序内存布局程序内存布局l操作系统为一个操作系统为一个C+程序运行定义了四个内存区域:程序运行定义了四个内存区域:代码区代码区存放程序代码。存放程序代码。全局数据区(静态区)全局数据区(静态区)存放全局变量、存放全局变量、static静态局部变量。全局变量在程序静态局部变量。全局变量在程序开始运行时就在该区分配;开始运行时就在该区分配;static静态局部变量在程序运行中第一次进入其作用域时静态局部变量在程序运行中第一次进入其作用域时在该区分配。二者都是直到程序运行结束才被释放。在该区分配。二者都是直到程序运行结束才被释放。局部数据区(栈区)局部数据区(栈区)存放存放auto局部变量。局部变量。在程序运行到其作用域时在栈区分在程序运行到其作用域时在栈区分配,但怎样分配在编译时就已经确定。配,但怎样分配在编译时就已经确定。auto局部变量在离开其作用域时即被释放。局部变量在离开其作用域时即被释放。动态数据区(自由存放区、堆区)动态数据区(自由存放区、堆区)存放运行时由存放运行时由 new运算符动态创建变量。运算符动态创建变量。动态创建变量在编译时无法为它们预定存放空间,系统依据运行时详细要求在该区动态创建变量在编译时无法为它们预定存放空间,系统依据运行时详细要求在该区进行分配。在该区变量必须用进行分配。在该区变量必须用 delete运算符才能将其释放。运算符才能将其释放。22第22页标识符作用域标识符作用域l作用域:作用域:指程序中标识符(如变量名、函数名)有效使用范围,即作用范围。指程序中标识符(如变量名、函数名)有效使用范围,即作用范围。l目标:目标:处理标识符同名问题。当标识符含有不一样作用域时,允许标识符同名;当处理标识符同名问题。当标识符含有不一样作用域时,允许标识符同名;当标识符作用域完全相同时,不允许标识符同名。标识符作用域完全相同时,不允许标识符同名。lC+中作用域有五种:中作用域有五种:块作用域块作用域 文件作用域文件作用域 函数原型作用域函数原型作用域 函数作用域函数作用域 类作用域类作用域23第23页标识符作用域标识符作用域块作用域块作用域l块:块:指程序中用花括号指程序中用花括号“”括起来一个程序段,称为一个块。括起来一个程序段,称为一个块。l块作用域:块作用域:在块内申明变量只能在该块内被引用,开始于变量申明处,结束于块结在块内申明变量只能在该块内被引用,开始于变量申明处,结束于块结尾处。尾处。l几条标准:几条标准:形参变量作用域:形参变量作用域:在其所属函数函数体块内。在其所属函数函数体块内。局部变量作用域:局部变量作用域:在其所属块内,该变量申明位置之后那个区域内。在其所属块内,该变量申明位置之后那个区域内。循环语句循环语句 for(表示式(表示式1;表示式;表示式2;表示式;表示式3)中表示式)中表示式1 所申明变量作用域:所申明变量作用域:在在for语句所属块内,该变量申明位置之后那个区域内。语句所属块内,该变量申明位置之后那个区域内。局部优先标准:局部优先标准:含有块作用域标识符在其作用域内,将屏蔽其作用块包含本块同名标含有块作用域标识符在其作用域内,将屏蔽其作用块包含本块同名标识符。识符。24第24页【例】(块作用域)【例】(块作用域)#include int fun(int n )cout “正在求:正在求:1+2+”n “n”;int s=0;for(int i=1;i=n;i+)char a=7;cout a;s+=i;return s;void main()int a=5,b=7;cout “第第1次调用:次调用:”fun(a)endl;int a=9,b=11;cout “第第2次调用:次调用:”fun(a)endl;cout “第第3次调用:次调用:”fun(b)endl;cout “第第4次调用:次调用:”fun(b)endl;形参形参 n 作用域作用域局部局部 s 作用域作用域局部局部 i 作用域作用域局部局部 a 作用域作用域局部局部 a、b 作用域作用域局部局部 a、b 作用域作用域运行:运行:正在求:正在求:1+2+5第第1次调用:次调用:15正在求:正在求:1+2+9第第2次调用:次调用:45正在求:正在求:1+2+11第第3次调用:次调用:66正在求:正在求:1+2+7第第4次调用:次调用:2825第25页【例】(块作用域)【例】(块作用域)#include void main()int a=10,b=20,c=30;cout “a=”a “tb=”b “tc=”c endl;int a=40,b=50;c=a+b;cout “a=”a “tb=”b “tc=”c endl;cout “a=”a “tb=”b “tc=”c endl;【例】(块作用域)【例】(块作用域)#include void main()for(int a=1 ;a=5 ;a+)int a=2 ;cout “a=”+a endl;cout “a=”a endl;运行:运行:a=10 b=20 c=30 a=40 b=50 c=90 a=10 b=20 c=90 运行:运行:a=3a=3a=3a=3a=3a=626第26页标识符作用域标识符作用域文件作用域文件作用域l文件作用域:文件作用域:在函数外申明变量可在该文件内被引用,开始于变量申明处,结束于在函数外申明变量可在该文件内被引用,开始于变量申明处,结束于文件结尾处,即一旦在某个位置定义了全局变量,在其后整个文件中均能够访问。文件结尾处,即一旦在某个位置定义了全局变量,在其后整个文件中均能够访问。l几条标准:几条标准:全局变量作用域从定义处开始到文件结尾处结束,遵照申明在前、使用在后。全局变量作用域从定义处开始到文件结尾处结束,遵照申明在前、使用在后。当全局变量引用在前、申明在后时,需先对全局变量作外部申明。当全局变量引用在前、申明在后时,需先对全局变量作外部申明。格式:格式:extern 类型类型 全局变量名全局变量名;当全局变量与块作用域内局部变量同名时,局部变量优先。当全局变量与块作用域内局部变量同名时,局部变量优先。在块作用域内,若要引用同名全局变量时,可经过域运算符在块作用域内,若要引用同名全局变量时,可经过域运算符“:”来引用。来引用。格式:格式::全局变量名全局变量名 27第27页【例】(文件作用域)【例】(文件作用域)#include int a=5,b;/a、b定义在函数外,定义在函数外,为全局变量为全局变量extern int c;/全局变量全局变量c引用在前、申明在后时,需先外部申明引用在前、申明在后时,需先外部申明void main()int a=10,b=20;/a、b定义在函数内,定义在函数内,为局部变量为局部变量 cout “a=”a “tb=”b “tc=”c endl;a=18;:b=:b+4;/引用全局变量引用全局变量b c=:a+a;/引用全局变量引用全局变量c和和a,引用,引用局部变量局部变量a cout “a=”a “tb=”b “tc=”c endl;cout “a=”:a “tb=”:b “tc=”c endl;int c=88;/c定义在函数外,定义在函数外,为全局变量为全局变量运行:运行:a=10 b=20 c=88 a=18 b=20 c=23 a=5 b=4 c=23 28第28页标识符作用域标识符作用域函数原型作用域、函数作用域函数原型作用域、函数作用域l函数原型作用域:函数原型作用域:在函数原型申明参数表中申明标识符,所含有作用域称为函数原型作用域,即从其申在函数原型申明参数表中申明标识符,所含有作用域称为函数原型作用域,即从其申明处开始,到函数原型申明结束处结束。明处开始,到函数原型申明结束处结束。函数原型申明中所申明标识符,其作用域仅在函数原型申明语句内,所以与该函数定函数原型申明中所申明标识符,其作用域仅在函数原型申明语句内,所以与该函数定义和调用均无关,所以在函数原型申明中可只作参数类型申明,而省略参数名。义和调用均无关,所以在函数原型申明中可只作参数类型申明,而省略参数名。【例】【例】函数原型申明:函数原型申明:void swap(int a,int b );/a、b作用域仅在该句内作用域仅在该句内 函数原型申明:函数原型申明:void swap(int ,int );l函数作用域:函数作用域:函数作用域是指在函数内定义标识符在其定义函数内都有效,即不论在函数内任何地函数作用域是指在函数内定义标识符在其定义函数内都有效,即不论在函数内任何地方定义,在整个函数内均能够引用。方定义,在整个函数内均能够引用。C+中只有语句标号含有函数作用域。中只有语句标号含有函数作用域。29第29页变量存放类型和生存期变量存放类型和生存期l存放类型:存放类型:变量存放类型反应了变量占用内存空间期限,它要求了变量生存期,即变量存放类型反应了变量占用内存空间期限,它要求了变量生存期,即何时为变量分配内存空间、何时撤消变量收回为其分配内存空间。何时为变量分配内存空间、何时撤消变量收回为其分配内存空间。l在申明变量时,可对其存放类型进行定义,格式:在申明变量时,可对其存放类型进行定义,格式:存放类型存放类型 类型类型 变量名变量名1=初值初值1 ,变量名,变量名2=初值初值2,;其中存放类型有四种:其中存放类型有四种:自动类型自动类型auto 静态静态类型类型static 存放器类型存放器类型register 外部类型外部类型extern 当存放类型省略时,对于局部变量则表示当存放类型省略时,对于局部变量则表示auto。30第30页变量存放类型和生存期变量存放类型和生存期lauto自动类型变量:自动类型变量:申明局部变量时,用申明局部变量时,用auto修饰属修饰属自动类型变量,自动类型变量,存放在局部数据区,即栈区存放在局部数据区,即栈区。auto局部变量在程序运行到其作用域时在栈区分配,在离开其作用域时即被释放,局部变量在程序运行到其作用域时在栈区分配,在离开其作用域时即被释放,所以生存期仅在其作用域内。所以生存期仅在其作用域内。申明局部变量时若省略存放类型,申明局部变量时若省略存放类型,C+编译器默认为编译器默认为auto。自动类型变量未初始化时,其初值不确定。自动类型变量未初始化时,其初值不确定。全局变量无自动类型。全局变量无自动类型。31第31页变量存放类型和生存期变量存放类型和生存期lstatic静态类型变量:静态类型变量:申明局部变量时,用申明局部变量时,用static修饰属静态修饰属静态类型变量,类型变量,存放在全局数据区,即静态区存放在全局数据区,即静态区。static局部变量生存期:在程序运行中第一次进入其作用域时在静态区分配,离开其局部变量生存期:在程序运行中第一次进入其作用域时在静态区分配,离开其作用域时并不释放,只是不能引用,若程序运行中再次进入该作用域时并不释放,只是不能引用,若程序运行中再次进入该static局部变量作用域,局部变量作用域,因为该变量已经存在,所以不再分配空间,可直接引用。因为该变量已经存在,所以不再分配空间,可直接引用。static局部变量直到程序运局部变量直到程序运行结束才被释放。行结束才被释放。static局部变量局部变量作用:是保留函数运行结果,方便再次调用该函数时,能继续使用上作用:是保留函数运行结果,方便再次调用该函数时,能继续使用上次调用计算结果。注意,不在其作用域时,不能直接引用;若需引用,可间接实现,次调用计算结果。注意,不在其作用域时,不能直接引用;若需引用,可间接实现,即经过该即经过该 static 局部变量局部变量地址进行访问(后续章节介绍)。地址进行访问(后续章节介绍)。32第32页变量存放类型和生存期变量存放类型和生存期 全局变量申明时不论前面加或不加全局变量申明时不论前面加或不加static,都含有静态生存期,因为全局变量都,都含有静态生存期,因为全局变量都存放存放在全局数据区,即静态区在全局数据区,即静态区。但用但用 static 修饰全局变量,称为静态全局变量。静态全局变量与普通全局变量在形修饰全局变量,称为静态全局变量。静态全局变量与普通全局变量在形式上类似,但含义有所不一样,静态全局变量只能在其定义源文件中有效(该文件式上类似,但含义有所不一样,静态全局变量只能在其定义源文件中有效(该文件中能够有若干个函数),而在该程序其它源文件中则是无效;而普通全局变量能够中能够有若干个函数),而在该程序其它源文件中则是无效;而普通全局变量能够经过经过 extern 修饰后,作用于该程序多个源文件。修饰后,作用于该程序多个源文件。静态静态类型变量未初始化时,其初值为类型变量未初始化时,其初值为0。33第33页【例】【例】#include int a=1,b=2;/a、b为全局变量,在静态区为全局变量,在静态区int fun()static int a=3;/a为静态局部变量,在静态区为静态局部变量,在静态区 int b=4;/b为为auto局部变量,在栈区局部变量,在栈区 a+=b;return a;void main()int a=5,b=6;/a、b为为auto局部变量,在栈区局部变量,在栈区 cout “a=”a “tb=”b endl;for (int i=1;i=3;i+)cout “第第”i “次调用:次调用:”fun()endl;cout “a=”a “tb=”b endl;cout “a=”:a “tb=”:b endl;运行:运行:a=5 b=6第第1次调用:次调用:7a=5 b=6第第2次调用:次调用:11a=5 b=6第第3次调用:次调用:15a=5 b=6a=1 b=234第34页【例】(与上例比
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服