




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章函数C程序设计快速进阶大学教程第1页本章关键点函数定义和分类
函数调用和申明
函数参数和函数值函数递归调用变量作用域与生存期内部函数和外部函数8/18/20242C程序设计快速进阶大学教程第2页10.1了解函数人类处理复杂问题方式:分解和抽象分而治之8/18/20243C程序设计快速进阶大学教程第3页10.1了解函数
分解抽象8/18/20244C程序设计快速进阶大学教程第4页函数(function)定义:把相关语句组织起来,并给它们注明对应名称,利用这种方法把程序分块,这种形式组合就称为函数。函数也称为例程或过程。函数作用:任务划分代码重用信息隐藏
10.1了解函数分而治之Divide&conquer8/18/20245C程序设计快速进阶大学教程第5页函数使用意义:程序模块化,使程序开发更轻易管理;
函数把较大任务分解成若干个较小任务,提炼出公用任务防止重复代码(redundance)软件复用性(softwarereusability)信息隐藏(hiddeninformation)10.1了解函数8/18/20246C程序设计快速进阶大学教程第6页例10.2采取函数分解,求任意两个正整数最大条约数(GCD)和最小公倍数(LCM).
/*辗转相除法求最大条约数*/intgcd(intiN1,intiN2){intiTemp=iN2;while(iTemp!=0){iTemp=iN1%iN2;iN1=iN2;iN2=iTemp;}returniN1;}/*求最小公倍数*/intlcm(intiN1,intiN2){intiGCDInside=gcd(iN1,iN2);
/*调用函数求最大条约数*/returniN1*iN2/iGCDInside;}7C程序设计快速进阶大学教程第7页例10.2采取函数分解,求任意两个正整数最大条约数(GCD)和最小公倍数(LCM)intmain(){intiNum1,iNum2;/*两个正整数*/intiGCD,iLCM;/*最大条约数与最小公倍数*/printf("Inputnum1&num2:");scanf("%d%d",&iNum1,&iNum2);
iGCD=gcd(iNum1,iNum2);/*调用函数求最大条约数*/iLCM=lcm(iNum1,iNum2);/*调用函数求最小公倍数*/printf("TheGCDof%dand%dis:%d\n",iNum1,iNum2,iGCD);/*输出最大条约数*/printf("TheLCMof%dand%dis:%d\n",iNum1,iNum2,iLCM);/*输出最小公倍数*/return0;}
8C程序设计快速进阶大学教程第8页10.1了解函数1.C程序是由多个函数组成。C程序能够由多个文件组成,文件负责组织存放若干个函数。2.源程序文件为C程序编译单位,每个文件单独编译,便于调试。
8/18/20249C程序设计快速进阶大学教程第9页10.1了解函数3.main函数是程序执行入口,main函数能够调用其它函数,其它函数调用结束后,还要返回main函数,main函数执行完成,整个程序就结束了。4.main函数能够出现在任何位置,但每个程序有且仅有一个main()函数。5.C程序全部函数都是平行定义,在一个函数内部不允许定义另外函数。函数能够相互调用,不过不能调用main函数。8/18/202410C程序设计快速进阶大学教程第10页类型
函数名(形式参数表)//functionheader{语句序列//functionbody}函数头(函数首部)——函数接口,包含:
返回值类型
函数体中由return语句返回值类型。没有返回值其类型为void
函数名
识别函数唯一标识符,不能与变量或数组重名
形参表
逗号分隔形式参数说明表列,缺省形式参数时不能省略圆括号。普通形式为:(类型参数1,类型参数2,…,类型参数n
)10.2函数定义和分类8/18/202411C程序设计快速进阶大学教程第11页类型
函数名(形式参数表)//functionheader{语句序列//functionbody}函数头(函数首部)——函数接口,包含:10.2函数定义和分类将控制返回函数调用点方法有三种。执行到“}”时返回;return;假如函数返回结果,则
returnexpression;函数返回—— Type
FunctionName() {//statements
return
expression; }
void
FunctionName() {//statements
return; //可省略 }8/18/202412C程序设计快速进阶大学教程第12页
无参函数普通形式
类型说明符函数名(){ 申明部分 执行语句部分}10.2.1函数定义longshowTime(){longlct;lct=time(0);returnlct;}longlCurTime=showTime();8/18/202413C程序设计快速进阶大学教程第13页2.有参函数普通形式类型说明符函数名(形式参数表){申明部分执行语句部分}形式参数表:类型1形参变量1,…类型n形参变量n10.2.1函数定义intmax(inta,intb,intc){intresult=(a>b)?a:b;if(result
<c)result=c;returnresult;}8/18/202414C程序设计快速进阶大学教程第14页10.2.1函数定义/*函数功效:实现××××功效函数参数:参数1,表示×××××
参数2,表示×××××
函数返回值:×××××*/返回值类型函数名(参数表){
函数体
return表示式;}3.编程规范:对函数接口加以注释说明
funcioninputoutput函数是一个“黑盒子”功效过程性与信息隐藏8/18/202415C程序设计快速进阶大学教程第15页1.函数分类-
主调函数和被调函数间数据传送
无参函数
函数定义、函数说明及函数调用中均不带参数
有参函数形参:在函数定义及函数说明时都有参数,称形式参数。实参:在函数调用时也必须给出参数,称为实际参数。进行函数调用时,主调函数将把实参值传送给形参.
10.2.2函数分类intgcd(intiN1,intiN2);iGCD=gcd(iNum1,iNum2);
8/18/202416C程序设计快速进阶大学教程第16页2.函数分类-从函数功效角度
有返回值函数
被调用执行完后将向调用者返回一个执行结果,称为函数返回值。
无返回值函数
用于完成某项特定处理任务,执行完成后不向调用者返回函数值。
10.2.2函数分类voidshowTime(){longlct;lct=time(0);printf("%ld",lct);}longshowTime(){longlct;lct=time(0);returnlct;}8/18/202417C程序设计快速进阶大学教程第17页3.函数分类-从函数定义角度
用户定义函数用以处理用户专门需要标准库函数
由系统提供库函数。标准库(standardlibrary)函数是在C/C++编程环境中提供。包含丰富函数集合,能够进行惯用数学计算、字符串操作、字符操作、输人/输出、错误检验和许多其它有用操作。10.2.2函数分类8/18/202418C程序设计快速进阶大学教程第18页库函数又可从功效角度作以下分类字符类型分类函数,转换函数字符串函数图形函数
输入输出函数数学函数日期和时间函数进程控制函数接口函数诊疗函数其它函数10.2.2函数分类8/18/202419C程序设计快速进阶大学教程第19页doubleAverage(intx,inty);//declarefunctionintmain(){inta=5,b=2;
doubleave=Average(a,b);//callfunction}/*函数名:Average.c
函数功效:计算两个数平均值函数入口参数:整型x,存放第一个运算数整型y,存放第二个运算数函数返回值:x与y平均数*/doubleAverage(intx,inty){ doubleresult; result=(x+y)/2.0; returnresult;}20C程序设计快速进阶大学教程第20页调用形式函数名(实际参数表)函数名
函数入口地址实际参数表
与形式参数在个数、类型、位置对应函数调用经过表示式或语句激活并执行函数代码过程函数返回值:return后面值作为函数带回值(称函数值)经过函数调用使主调函数得到确实定值。10.3.1函数调用参数可取常量、变量或表示式。8/18/202421C程序设计快速进阶大学教程第21页10.3.1函数调用函数调用过程执行次序运行主调函数当运行当函数调用语句时,开始执行被调函数;被调函数执行结束后,回到主调函数;继续执行主调函数。
8/18/202422C程序设计快速进阶大学教程第22页10.3.1函数调用在C语言中,能够用以下几个方式调用函数:函数表示式:函数作为表示式中一项出现在表示式中,以函数返回值参加表示式运算。2.函数语句:函数调用普通形式加上分号。
doubleave=Average(a,b);printf(“%f”,ave);8/18/202423C程序设计快速进阶大学教程第23页10.3.1函数调用在C语言中,能够用以下几个方式调用函数:3.函数实参:函数作为另一个函数调用实际参数出现。把该函数返回值作为实参进行传送,要求该函数必须是有返回值。函数能够嵌套调用
,不允许嵌套定义!
voidmain(){voidfunc(){ ……}}printf(“%f”,Average(a,b));Max=max(a,max(b,c));8/18/202424C程序设计快速进阶大学教程第24页函数调用中求值次序问题对实参表中各量是自左至右还是自右至左使用未作要求。
例10.5输出i1增减后值#include<stdio.h>intmain(){inti1=3;printf("%d%d\n",++i1,--i1);return0;}2?2325C程序设计快速进阶大学教程第25页#include<stdio.h>doublemax(doublex,doubley)
{if(x>y)returnx;elsereturny;}
voidmain(){doublea,b,c;
scanf("%lf,%lf",&a,&b);c=max(a,b);printf(“Maxis%f\n",c);
printf("Maxis
%f\n",
max(c,3.5));
}函数定义出现在调用之前无必要作函数原型申明函数定义即为函数原型26C程序设计快速进阶大学教程第26页
#include<stdio.h>doublemax(doublex,doubley); //函数原型voidmain(){doublea,b,c;
scanf("%lf,%lf",&a,&b);c=max(a,b);//函数调用printf("Maxis%f\n",c);
printf("Maxis%f\n",
max(c,3.5));}doublemax(doublex,doubley) //函数定义{
return(x>y?x:y);
}27C程序设计快速进阶大学教程第27页10.3.2函数申明函数遵照先定义后使用标准。若被调用函数在主调函数之前定义,需在被调函数调用之前进行申明.函数申明作用:编译器依据函数原型检验函数调用正确性:函数名字;函数返回数据类型;函数要接收参数个数、类型和参数次序。8/18/202428C程序设计快速进阶大学教程第28页
函数原型functionprototype
10.3.2函数申明申明语句普通形式:类型说明符被调函数名(类型形参,类型形参…);或类型说明符被调函数名(类型,类型…);doublemax(doublex,doubley);doublemax(double,double);8/18/202429C程序设计快速进阶大学教程第29页
例10.6经过函数计算两个浮点数和#include<stdio.h>intmain(){floatfA=3.5,fB=4.6,fC;floatadd(floatfA1,floatfB1);/*函数申明*/fC=add(fA,fB);/*函数调用*/printf("%f\n",fC);return0;}floatadd(floatfA1,floatfB1)/*函数定义*/{returnfA1+fB1;}对库函数调用不需作说明?30C程序设计快速进阶大学教程第30页10.4函数参数和函数值主调函数和被调用函数之间有数据传递关系。在不一样函数之间传递数据,能够使用方法有:参数:
经过形式参数和实际参数函数传递参数机制--按值传递(callbyvalue)返回值:用return语句返回计算结果
8/18/202431C程序设计快速进阶大学教程第31页#include<iostream.h>doublemax(double,double);
//函数原型voidmain(){doublea,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);//函数调用printf("Maxis%d\n",c);
printf("Maxis%d\n",
max(c,3.5));}doublemax(doublex,doubley) //函数定义{intz;z=x>y?x∶y;return(z);}32C程序设计快速进阶大学教程第32页关于形参加实参说明:1.实参能够是常量、变量或表示式,在调用时将实参值赋给形参。max(3,a+b);2.实参加形参类型应相同或赋值兼容。max(’3’,’2’+b);max(3.5,dNum);doublemax(doublex,doubley);10.4.1形式参数与实际参数20.0320.03xyab8/18/202433C程序设计快速进阶大学教程第33页例10.7经过函数调用试图交换两个整数#include<stdio.h>intmain(){intiA=3,iB=4;voidswap(intiA1,intiB1);/*函数申明*/swap(iA,iB);/*函数调用*/printf("iA=%d,iB=%d\n",iA,iB);return0;}voidswap(intiA1,intiB1)/*函数定义*/{intiC1;iC1=iA1;iA1=iB1;iB1=iC1;}34C程序设计快速进阶大学教程第34页例10.7经过函数调用试图交换两个两个整数#include<stdio.h>intmain(){intiA=3,iB=4;voidswap(intiA1,intiB1);/*函数申明*/swap(iA,iB);/*函数调用*/printf("iA=%d,iB=%d\n",iA,iB);return0;}voidswap(intiA1,intiB1)/*函数定义*/{intiC1;iC1=iA1;iA1=iB1;iB1=iC1;}35C程序设计快速进阶大学教程第35页4.实参向形参数据传递是单向“值传递”只能把实参值传送给形参,不能把形参值反向地传送给实参。在函数调用过程中形参值发生改变,实参值不会改变。关于形参加实参说明:3.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配内存单元。形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。10.4.1形式参数与实际参数8/18/202436C程序设计快速进阶大学教程第36页10.4.2函数返回值1.函数值只能经过return语句返回主调函数。return语句普通形式
return表示式;或return(表示式);功效是计算表示式值,并返回给主调函数。在函数中允许有多个return语句(通常在条件语句中),但每次调用只能有一个return语句被执行;当return语句执行时,函数也就结束了,返回到主调函数,其它return语句就不会被执行。8/18/202437C程序设计快速进阶大学教程第37页例10.8对一个1到100之间随机数,计算其与7取余值#include<stdio.h>#include<time.h>intmain(){intiResult;intgetRand();iResult=getRand()%7;printf("%d",iResult);return0;}/*获取1到100之间随机数*/intgetRand(){intiRand1;srand(time(0));
/*生成1到100之间随机数*/iRand=rand()%100+1;returniRand;}38C程序设计快速进阶大学教程第38页10.4.2函数返回值2.函数返回值应该属于某一个确定类型,在定义函数时指定函数返回值类型。
3.函数值类型和函数定义中函数类型应保持一致。假如二者不一致以函数类型为准,将返回值自动进行类型转换。
4.不返回函数值函数,能够明确定义为空类型,类型说明符为“void”。凡不加类型说明函数,自动按整型处理。8/18/202439C程序设计快速进阶大学教程第39页//强制类型转换
intmain(){floatadd1(float,float);
floatadd2(int,int);
doublea=3,b=3.2,sum;sum=add1(a,b);sum=add2(1/a,1/b);return0;}floatadd1(floatx,floaty){return(x+y);}floatadd2(inti,intj){return(i+j);}类型强制转换截取整数部分传送给形参40C程序设计快速进阶大学教程第40页10.4.3数组作函数参数1.数组元素作为函数参数-按值传递数组元素作为函数实参和一个普通变量使用方法相同,函数调用时值传送是把实参变量值赋予形参变量2.数组名作为函数参数-按地址传递数组名实际上是一个常量地址,当用数组名作为实参时,实际上是把该常量地址传给形参。形参数组并不分配接收实参数组元素数据空间,只是分配一个接收常量地址.
8/18/202441C程序设计快速进阶大学教程第41页例10.9数组元素作实参#include<stdio.h>intmain(){intiArr1[3]={2,5,3};intiA=2,iB=5,iC=3,iSum;intadd(intiA,intiB,intiC);iSum=add(iArr1[0],iArr1[1],iArr1[2]);/*数组元素作为实参*/printf("%d\n",iSum);iSum=add(iA,iB,iC);/*普通变量作为实参*/printf("%d\n",iSum);return0;}intadd(intiA,intiB,intiC){intiSum=(iA++)+(iB--)+iC;returniSum;}42C程序设计快速进阶大学教程第42页例10.10对数组中每个元素加1#include<stdio.h>intmain(){intiArr1[3]={2,5,3},iJ;voidadd(intiArr2[3]);/*输出数组*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");
add(iArr1);/*函数调用后,输出数组*/for(iJ=0;iJ<=2;iJ++) printf("%d",iArr1[iJ]);printf("\n");return0;}voidadd(intiArr2[3]){intiI;for(iI=0;iI<=2;iI++) iArr2[iI]++;}43C程序设计快速进阶大学教程第43页10.4.3数组作函数参数2.数组名作为函数参数-按地址传递
通常为了能够让函数处理不一样长度数组,函数参数表应指定接收数组名及数组大小。一维形参数组能够省略维数,不过不能省略[]!
voidadd(intiArr[],intiLength);add(iArr1,3);/*intiArr1[3]*/add(iArr2,5);/*intiArr2[5]*/123iArriArr12348/18/202444C程序设计快速进阶大学教程第44页10.4.3数组作函数参数2.数组名作为函数参数-按地址传递多维数组也能够作为函数参数。形参数组能够指定每一维长度,也可省去第一维长度。
voidadd(intiArr2[][4],intiRow,intiCol);
add(iArr1,3,4);
/*intiArr1[3][4]*/add(iArr2,4,4);/*intiArr2[4][4]*/8/18/202445C程序设计快速进阶大学教程第45页10.5函数递归调用程序从主函数开始执行;主函数由操作系统调用,主函数能够调用其它函数;其它函数能够相互调用,但不能调用主函数;全部函数是平行,不能嵌套定义!函数之间关系8/18/202446C程序设计快速进阶大学教程第46页main()调用fa()fa()调用fb()voidfa(){…}voidfb(){…}main(){fa()fb()}fb()
函数嵌套调用
8/18/202447C程序设计快速进阶大学教程第47页main()
调用fa()fa()调用fb()fb()voidfb(){}voidfa(){fb();}main(){…
fa()...}返回fa()
返回main()
函数嵌套调用
例:定义一个求bin(n,k)函数。8/18/202448C程序设计快速进阶大学教程第48页voidfa();intfb();intfc();voidmain(){fa();fc();}main()调用fa()fa()调用fb()fc()调用fc()调用fc()fb()
函数嵌套调用
例:验证歌德巴赫猜测Goldbach(intm)Prime(intn)printf8/18/202449C程序设计快速进阶大学教程第49页voidfa();{fa()}voidmain(){fa()}main()调用fa()Endfa()调用fa()fa()famain10.5函数递归调用8/18/202450C程序设计快速进阶大学教程第50页有5个人在一起,探讨年纪问题问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2个人大2岁。问第2个人,说比第1个人大2岁。最终问第1个人,他说是10岁。请问第5个人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(n)=10(n=1)age(n-1)+2(n>1)10.5函数递归调用8/18/202451C程序设计快速进阶大学教程第51页递归调用一个函数在其函数体中又直接或间接调用本身一个方法。把一个复杂问题层层转化为一个与原问题相同规模较小问题来求解。递归需要有递归结束条件和简化过程。10.5函数递归调用intage(intn){intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}8/18/202452C程序设计快速进阶大学教程第52页10.5函数递归调用递归函数
(recursivefunction)直接调用自己或经过另一函数间接调用自己函数问题1:计算n阶乘简化过程:
n>1时,n!=n*(n-1)!递归结束:
n=1时,n!=18/18/202453C程序设计快速进阶大学教程第53页例10.13计算n阶乘intfact(intn){if(n==1)return1;elsereturnn*fact(n-1);}intfact(intiN1){intiF1;if(iN1>1)iF1=fact(iN1-1)*iN1;/*递归调用fact函数*/else iF1=1;returniF1;}递归终止条件基本情况修改递归条件54C程序设计快速进阶大学教程第54页例10.13计算n阶乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)2*
F(1)n1F(0)1计算Fact(3)=3!F(1)n01*
F(0)递归是从复杂推到简单(递归调用),再由简单返回到复杂(返回值)一个过程55C程序设计快速进阶大学教程第55页例10.13计算n阶乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)2*
F(1)n1计算Fact(3)=3!F(1)1*
F(0)F(0)1n0F(1)=1递归是从复杂推到简单(递归调用),再由简单返回到复杂(返回值)一个过程56C程序设计快速进阶大学教程第56页例10.13计算n阶乘k3F(k)Output3!=?n3F(3)3*F(2)n2F(2)计算Fact(3)=3!F(2)=2F(3)=63!=6递归是从复杂推到简单(递归调用),再由简单返回到复杂(返回值)一个过程57C程序设计快速进阶大学教程第57页k3F(3)k3F(3)n3F(3)3*F(2)n2F(2)2*
F(1)n1F(0)1F(1)n01*
F(0)F(1)=1F(2)=2F(3)=6Output3!=6intFact(intn){if(n==0)return1;elsereturnn*Factorial(n-1);}计算Factorial(3)=3!58C程序设计快速进阶大学教程第58页intfact(intiN1){intiF1;if(iN1>1)iF1=fact(iN1-1)*iN1;
elseiF1=1;returniF1;}59C程序设计快速进阶大学教程第59页10.5函数递归调用问题2:计算斐波那契数列第n个数f(n)
简化过程:f(n)=f(n-1)+f(n-2)递归结束:当n=1或n=2时f(n)=1
8/18/202460C程序设计快速进阶大学教程第60页例递归定义斐波那契数列intfib(intiN1){intiF1;if(iN1==1||iN1==2)iF1=1;else iF1=fib(iN1-1)+fib(iN1-2);/*递归调用fib函数*/returniF1;}函数体内调用两次本身61C程序设计快速进阶大学教程第61页10.5函数递归调用问题3:
在n个数(a[1],a[2],…a[n])中找出最大数f(n)
简化过程:f(n)=f(n-1)和a[n]最大值
递归结束:当n=1时f(n)=a[1]
8/18/202462C程序设计快速进阶大学教程第62页intmax(intiArr1[],intiN1){intiMax1,iTemp;if(iN1>1){iTemp=max(iArr1,iN1-1);/*递归调用max函数*/if(iTemp>iArr1[iN1])iMax1=iTemp;else iMax1=iArr1[iN1];}elseiMax1=iArr1[1];returniMax1;}iMax=max(iArr,iN);63C程序设计快速进阶大学教程第63页递归调用讨论
10.5函数递归调用递归目标是简化程序设计;
能更自然地反应问题,使程序更轻易了解。递归增加了系统开销,
延长了CPU执行时间,多占用了内存栈空间;非递归效率高,不过程序可读性差;
大多数递归函数都能用非递归函数来代替
8/18/202464C程序设计快速进阶大学教程第64页递归思想10.5函数递归调用递归函数将复杂问题分成两个部分:函数中不能够处理部分-递归调用递归调用,要模拟原问题,但稍作简化或缩小。
递归步骤与关键字return:函数中能够处理部分——基本情况
对基本情况函数调用只是简单地返回一个结果。
递归不能无限调用!递归函数要有条件调用本身,必须有递归停顿条件
8/18/202465C程序设计快速进阶大学教程第65页10.6变量作用域与生存期标识符生存期是其在内存中存在时间。变量有效性范围称变量作用域。变量说明方式不一样,其作用域也不一样。按作用域范围可分局部变量和全局变量。
标识符作用域是程序中能引用它区域。存放类说明符:auto、register、extern、static两个存放类:自动存放类&静态存放类
8/18/202466C程序设计快速进阶大学教程第66页10.6.1变量作用域变量按作用域不一样可分为两类:局部变量(localvariable)在一个函数内部定义变量是内部变量只在本函数范围内有效:
全局变量(globalvariable)在函数之外定义变量是外部变量有效范围为从定义变量位置开始到根源文件结束8/18/202467C程序设计快速进阶大学教程第67页10.6.1变量作用域1.局部变量-内部变量。局部变量是在函数内作定义说明。其作用域仅限于函数内,离开该函数后再使用这种变量是非法。intmax(intiA,intiB){intiC;if(iA>iB)returniA;elsereturniB;}
voidmain(){intiM=1,iN=2;intiA=iM,iB=iN;intiC=max(iM,iN);iC=max(iA,iB);}实参和形参为同名变量8/18/202468C程序设计快速进阶大学教程第68页10.6.1变量作用域局部变量作用域几点说明:(1)主函数中定义变量也只能在主函数中使用,不能在其它函数中使用。主函数中也不能使用其它函数中定义变量。(2)形参变量是属于被调函数局部变量,实参变量是属于主调函数局部变量。(3)允许在不一样函数中使用相同变量名,它们代表不一样对象,分配不一样单元,互不干扰,也不会发生混同。8/18/202469C程序设计快速进阶大学教程第69页例10.16复合语句中局部变量作用域#include<stdio.h>intmain(){intiJ=1,iK=2;{
intiK=3,iL=4;printf("iJ=%d\n",iJ); printf("iK=%d\n",iK); printf("iL=%d\n",iL);}printf("iJ=%d\n",iJ);printf("iK=%d\n",iK);printf("iL=%d\n",iL);return0;}编译报错,iL未定义
复合语句中定义变量只在本复合语句范围内有效。同名时内部变量屏蔽外部!
70C程序设计快速进阶大学教程第70页10.6.1变量作用域2.全局变量-外部变量在函数外部定义变量。它不属于任何函数,作用域是整个程序,有效范围为从定义变量位置开始到根源文件结束。全局变量说明符为extern。在一个函数之前定义全局变量,在该函数内使用可不再加以说明。intiA,iB;voidf1(){……}floatfX,fY;intf2(){……}voidmain(){……}8/18/202471C程序设计快速进阶大学教程第71页例10.17输入长方体长宽高l、w、h,求体积及表面积#include<stdio.h>intiArea;intvolumeAndArea(intiL,intiW,intiH){iArea=2*(iL*iW+iL*iH+iW*iH);returniL*iW*iH;}intmain(){intiL,iW,iH,iVolume;printf("inputlength,widthandheight\n");scanf("%d%d%d",&iL,&iW,&iH);iVolume=volumeAndArea(iL,iW,iH);printf("\nvolume=%d\narea=%d\n",iVolume,iArea);return0;}函数调用返回体积表面积存放在全局变量中72C程序设计快速进阶大学教程第72页例10.18输入长方体长宽高l、w、h,求体积及表面积#include<stdio.h>intiArea;intvolumeAndArea(intiL,intiW,intiH){intiArea;/*定义局部变量iArea,与全局变量同名*/iArea=2*(iL*iW+iL*iH+iW*iH);returniL*iW*iH;}intmain(){intiL,iW,iH,iVolume;printf("inputlength,widthandheight\n");scanf("%d%d%d",&iL,&iW,&iH);iVolume=volumeAndArea(iL,iW,iH);printf("\nvolume=%d\narea=%d\n",iVolume,iArea);return0;}表面积值为0全局变量iArea73C程序设计快速进阶大学教程第73页10.6.1变量作用域2.全局变量-外部变量允许全局变量和局部变量同名。在局部变量作用域内,全局变量被屏蔽。
无须要时尽可能不要使用全局变量全局变量可加强函数模块之间数据联络,不过又使函数要依赖这些变量,使得函数独立性降低。全局变量在程序全部执行过程中都占用内存。8/18/202474C程序设计快速进阶大学教程第74页10.6.2变量存放类别与生存期程序内存区域数据区(dataarea)动态存放区存放类存放特征代码区(codearea)静态存放区
全局数据和静态数据局部数据和动态数据静态存放变量在编译时就分定存放单元并一直保持不释放直至整个程序结束。动态存放变量在程序执行过程中,使用它时才分配存放单元,使用完成马上释放。
8/18/202475C程序设计快速进阶大学教程第75页10.6.2变量存放类别与生存期标识符生存期是其在内存中存在时间。因为变量存放方式不一样而产生特征称变量生存期。存放类说明符:
auto、register、extern、static分为两个存放类:自动存放类(automaticstorageclass)静态存放类(staticstorageclass)8/18/202476C程序设计快速进阶大学教程第76页10.6.2变量存放类别与生存期自动变量和存放器变量属于动态存放方式,外部变量和静态变量属于静态存放方式。变量申明定义完整形式:存放类型说明符数据类型说明符变量名,变量名…;staticintiA,iB;申明定义静态类型变量autocharcA,cB;申明定义自动字符变量registerintiK=1;申明定义存放器变量externintiX,iY;申明外部整型变量
8/18/202477C程序设计快速进阶大学教程第77页10.6.2变量存放类别与生存期1.自动变量auto自动存放变量属于动态存放方式,存放在动态区进入申明作用域时生成,离开作用域时删除;函数参数和局部变量都是自动存放类自动存放是变量默认状态若不赋初值则没有明确值intmax(intiA,intiB){autointiC;if(iA>iB)returniA;elsereturniB;}
8/18/202478C程序设计快速进阶大学教程第78页10.6.2变量存放类别与生存期2.外部变量extern外部变量定义时位于函数之外,即全局变量.全局变量是从它作用域提出,外部变量从存放方式提出,表示了其生存期。能够在定义时作初始化赋值,即只赋初值一次,若定义时不赋初值,编译时自动赋初值:数值型变量初值0字符变量初值为空字符8/18/202479C程序设计快速进阶大学教程第79页10.6.2变量存放类别与生存期2.外部变量extern当一个源程序由若干个源文件组成时,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年四年级人教版下学期数学期中考试卷(提升卷)(含解析)
- 2025-2030中国环保玻璃胶行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国生物MEMS行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国狗肉行业发展分析及发展前景与投资研究报告
- 2025-2030中国特种胶板行业供需趋势及投资风险研究报告
- 2025-2030中国物资管理系统行业市场深度调研及发展趋势与投资前景研究报告
- 2025-2030中国熊果酸行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国煤化工装备行业投资规模及发展策略建议研究报告
- 湖南省长沙二十一中2024-2025学年高三第二次调研物理试卷含解析
- 四川省遂宁高级实验学校2025届高三下学期期中物理试题文试题
- 2025年河南医学高等专科学校单招职业适应性考试题库含答案
- 肿瘤化学疗法的护理
- 血液灌流治疗与护理
- 沪科版七年级下册数学期中考试题(附答案)
- 2025至2030年中国网球捡球篮数据监测研究报告
- 2024年河南烟草行业招聘笔试真题
- 美团述职报告
- 《食管癌讲》课件
- 高分子化学6-离子聚合-阴离子聚合
- 2025版无人机生产加工委托合同3篇
- 军事法规基础知识
评论
0/150
提交评论