结构化程序设计.ppt
intgcd(inta,intb)1{intr=a;2do{a=b;b=r;r=a%b;3}while(r);4returnb;5}6函数定义(续)《程序设计》-2005年秋*C语言也允许在函数名后的圆括号内只给出各形参的名,随后才指定各形参的类型,但这种写法在C++中已不允许doublemin(x,y)doublex,y;{returnxy?x:y;}C语言还允许函数体为空的函数dummy()/*或dummy(void)*/{}函数调用《程序设计》-2005年秋*函数被定义以后,凡要实现函数功能的地方,就可简单地通过函数调用来完成01函数调用的一般形式为02函数名(实在参数表)03实在参数,简称实参。函数调用时的实参按它们出现的顺序与函数定义中的形参一一对应,并要求实参类型与其对应的形参类型相一致04函数调用(续)《程序设计》-2005年秋*STEP5STEP4STEP3STEP2STEP1函数调用有两种方式传值调用(callbyvalue)把实参的值传给被调用函数的参数(形参)。这时,被调用函数对参数的改变,不影响调用函数实参的原始值传引用调用(callbyreference)把实参的地址传给被调用函数的参数(形参)地址。这时,被调用函数对参数的改变,将影响到调用函数实参的原始值函数调用(续)《程序设计》-2005年秋*1对doublemin(doublex,doubley)的函数调用w=min(u,v);2函数调用min(u,v)就是对函数min()的调用,它提供了两个实参u和v,分别对应形参x和y3如果调用无形参的函数,这时函数的调用形式变为4函数名()5其中函数名之后的一对圆括号是不能省略的函数调用(续)《程序设计》-2005年秋*1按函数调用在程序中的作用,有两种不同类型的应用2函数调用只是利用函数所完成的功能。此时,将函数调用作为一个独立的语句。这种应用不要求或无视函数的返回值3如程序中经常使用的调用格式输入函数scanf()和格式输出函数printf()等。4函数调用是利用函数的返回值。或用这返回值继续进行表达式的计算,或输出函数返回值等函数调用的执行过程《程序设计》-2005年秋*1为形参分配内存空间2计算实参表达式的值,并将值赋给对应的形参3为函数的局部变量分配内存空间4执行函数体内的语句序列5函数体执行完,或执行了return语句后,释放为这次函数调用分配的全部内存空间6将函数值(如果有)返回到函数调用处继续执行#includestdio.hdoublex,y,d,min(double,double);voidmain(){printf(“Enterx,y.\n”);scanf(“%lf%lf”,x,y);d=min(x,y);printf(“MIN(%.3f,%.3f)=%.3f\n”,x,y,d);}doublemin(doublea,doubleb){doubletemp;temp=ab?b:a;returntemp;}对函数调用的说明《程序设计》-2005年秋*当函数执行return语句或执行完函数体的语句序列后,函数的这次调用就执行结束,随之将控制返回到函数调用处继续执行函数的返回值是通过执行return语句时,计算return之后的表达式值而获得的。如果函数不提供返回值,则return语句不应包含表达式。如果函数有返回值,则应有确定的类型,并在函数定义时指明。若函数定义时不指明返回值类型,且函数有返回值,C语言约定该函数的返回值类型为int型对函数调用的说明(续)《程序设计》-2005年秋*为了明确指明函数不提供返回值,建议在函数定义时,在函数名之前写上void。并在这样的函数体内,所有的return语句都不应该带表达式当函数执行不带表达式的return语句返回时,函数并不是一定不带回值,而是返回一个不确定的值。这样的函数调用不应该利用函数返回值进行再计算,否则会产生错误结果函数定义中的return语句的表达式类型应与函数定义中指明的返回值类型相一致。如果return语句中的表达式类型与函数定义指明的返回值类型不一致时,对于是基本类型情况,则以函数的返回值类型为准,系统会自动进行类型转换123实参向形参单向传递数据《程序设计》-2005年秋*