第5章函数习题及解答一.选择题。1.若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是A)函数调用可以作为独立的语句存在B)函数调用可以作为一个函数的实参C)函数调用可以出现在表达式中D)函数调用可以作为一个函数的形参答案:D解析:本题综合考查函数的调用方式。函数的形参和实参具有以下特点:①形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。②实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。③实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误。④函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。2.有以下程序intfun(intx,inty){return(x+y);}main(){inta=2,b=5,c=8;printf(%d\n,fun((int)fun(a+c,b),a-c));}程序运行后的输出结果是A)编译出错B)9C)21D)9.0答案:B解析:本题考查函数的综合知识。首先,我们可以利用强制转换类型转换运算符将一个表达式转换成所需类型。如:(double)a是将a转换成double类型;(int)(x+y)是将x+y的值转换成整型。本题可按部就班地逐步运算:fun((int)fun(a+c,b),a-c)fun((int)fun(10,5),2-8)fun((int)15.000000,-6)fun(15,-6)93.若有以下调用语句,则不正确的fun函数的首部是main(){…inta[50],n;…fun(n,&a[9]);…}A)voidfun(intm,intx[])B)voidfun(ints,inth[41])C)voidfun(intp,int*s)D)voidfun(intn,inta)答案:D解析:函数定义的一般形式为:类型说明符函数名(){类型说明语句}根据fun函数的调用语句可知,fun函数的第二个参数是一个地址值。4.以下说法正确的是A)C语言程序总是从第一个的函数开始执行B)在C语言程序中,要调用函数必须在main()函数中定义C)C语言程序总是从main()函数开始执行D)C语言程序中的main()函数必须放在程序的开始部分答案:C解析:C语言的程序是由主函数main()开始运行,由主函数来调用其他函数,所以,选项A)错误。C语言中定义的函数必须是并列的,不能在一个函数中定义其他函数,选项B)错。函数必须先定义后使用,在调用函数以前要定义函数,而main()函数不必放在最前面,故选项D)错。5.以下程序中函数sort的功能是对a数组中的数据进行由大到小的排序voidsort(inta[],intn){inti,j,t;for(i=0;in-1;i++)for(j=i+1;jn;j++)if(a[i]a[j]){t=a[i];a[i]=a[j];a[j]=t;}}main(){intaa[10]={1,2,3,4,5,6,7,8,9,10},i;sort(&aa[3],5);for(i=0;i10;i++)printf(%d,,aa[i]);printf(\n);}程序运行后的输出结果是A)1,2,3,4,5,6,7,8,9,10,B)10,9,8,7,6,5,4,3,2,1,C)1,2,3,8,7,6,5,4,9,10,D)1,2,10,9,8,7,6,5,4,3,答案:C解析:C语言中,实参变量和形参变量之间的数据传递是单向的“值传递”方式。指针变量作函数参也要遵循这一规则,调用函数不可能改变实参指针变量的值,但可以改变实参指针变量所指变量的值。6.在调用函数时,如果实参是简单的变量,它与对应形参之间的数据传递方式是A)地址传递B)单向值传递C)由实参传形参,再由形参传实参D)传递方式由用户指定答案:B解析:如果实参是简单变量,它与对应形参之间的数据传递方式是由实参传给形参,而形参值的改变不能改变实参的值。7.以下叙述中正确的是A)构成C程序的基本单位是函数B)可以在一个函数中定义另一个函数C)main()函数必须放在其他函数之前D)所有被调用的函数一定要在调用之前进行定义答案:A解析:本题综合考查C语言的概念部分,关于C语言,我们应该了解以下必须要掌握的基础知识:①C程序是由函数构成的。②一个函数由两部分组成:函数的首部和函数体。③一个C程序总是从main函数开始执行的,而不论main函数的整个程序中的位置如何(main函数可以放在程序最开始,也可以放在程序最后,或写在一些函数之前,在另一些函数之后)。④C程序在书写上,表现形式比较自由,一行内可以写几个语句,一个语句可以分写在几行上。每个语句和数据定义的最后必须有一个分号。8.若有函数内部说明:inta[3][4];则数组a中各元素A)可在程序的运行阶段得到初值0B)可在程序的编译阶段得到初值0C)不能得到确定的初值D)可在程序的编译或运行阶段得到初值0答案:C解析:我们可以把二维数组的常量表达式看做是矩阵或者表格的行数与列数,要注意每个元素有两个下标,第一个是方括号中的下标代表行号,称行下标;第二个是方括号中的下标代表列号。行下标和列下标总是从0开始的,二维数组在不赋初值时,不能得到确定。9.有以下函数charfun(char*p){returnp;}该函数的返回值是A)无确切的值B)形参p中存放的地址值C)一个临时存储单元的地址D)形参p自身的地址值答案:B解析:本题考查函数返回值的知识。函数返回值是通过函数中的return语句获得,return语句中的表达式的值就是所求函数的值。此表达式的值必须与函数首部所说明的类型一致。若类型不一致,则以函数值的类型为准,由系统进行转换。10.以下正确的说法是A)定义函数时,形参的类型说明可以放在函数体内B)return后边的值不能为表达式C)如果函数值的类型与返回值类型不一致,以函数值类型为准D)如果形参与实参类型不一致,以实参类型为准答案:C解析:选项A)中定义函数时,形参的类型说明应该放在形参表列内说明。老版本C语言中,对形参类型的声明是放在函数定义的第2行,也就是不在第1行的括号内指定形参的类型,而在括号外单独指定。选项B)中return后面的值可以是一个表达式。选项D)中实参与形参的类型应相同或赋值兼容。如果实参为整型而形参为实型,或者相反,则按不同类型数值的赋值规则进行转换,以形参类型为准。11.有以下程序intf(intn){if(n==1)return1;elsereturnf(n-1)+1;}main(){inti,j=0;for(i=1;i3;i++)j+=f(i);printf(%d\n,j);}程序运行后的输出结果是A)4B)3C)2D)1答案:B解析:在main函数中,对f(1)和f(2)的值进行了累加。f(1)=1f(2)=f(1)+1=2最后,j的值为1+2=312.在C语言中,变量的隐含存储类别是A)autoB)staticC)externD)无存储类别答案:A解析:auto变量:无static声明的局部变量。用auto作存储类别的声明时,可以不写auto,存储类别隐含确定为auto(自动存储类别)。是动态存储方式。大多数变量是自动变量。用static声明的局部变量是静态局部变量。函数调用结束后静态局部变量占据的内存存储单元空间不释放,局部变量保留原值,下次调用时可以继续使用该值。用extern声明外部变量,外部变量即全局变量,可以用extern声明来改变全局变量的作用域,实际上,关键字“auto”可以省略,auto不写则隐含确定为“自动存储类别”,它属于动态存储方式。13.若有以下程序#includestdio.hvoidf(intn);main(){voidf(intn);f(5);}voidf(intn){printf(%d\n,n);}则以下叙述中不正确的是A)若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数fB)若在主函数前对函数f进行说明,则在主函数和其后的其他函数中都可以正确调用函数fC)对于以上程序,编译时系统会提示出错信息:提示对f函数重复说明D)函数f无返回值,所以可用void将其类型定义为无返回值型答案:C解析:C语言规定,一个函数中调用另一个函数(即被调用函数)需要具备的条件有:①首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)。②如果使用库函数,一般还应该在本文件开头用#include命令将函数调用有关库函数时所需要到的信息“包含”到本文件中来。③如果使用自定义函数,而且该函数与调用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数作声明,即向编译系统声明将要调用此函数,并将有关信息通知编译系统。在C语言中,可以使用函数原型进行声明,函数原型的一般形式为:函数类型函数名(参数类型1,参数类型2)或函数类型函数名(参数类型1参数名1,参数类型2参数名2)14.有如下程序longfib(intn){if(n2)return(fib(n-1)+fib(n-2));elsereturn(2);}voidmain(){printf(“%d\n”,fib(3));该程序的输出结果是A)2B)4C)6D)8答案:B15.有如下函数调用语句func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中,含有的实参个数是A)3B)4C)5D)有语法错答案:A16.C语言允许函数值类型缺省定义,此时该函数隐含的类型是________。A)float型B)int型C)long型D)double型答案:B17.以下存储类型只有在使用时才为该类型变量分配内存的是________。A)auto和staticB)auto和registerC)register和staticD)static和extern答案:B18.设有以下函数:fun(intx){inty=0;staticintz=2;y++;z++;return(x+y+z);}若在下面主程序中调用该函数,则输出结果是________。main(){intx=3,k;for(k=1;k=3;k++)printf(%d\n,fun(x));}A)7B)7C)7D)789107911137答案:A19.运行下面程序:intff(intn){staticintf=1;f=f*n;returnf;}main(){intk;for(k=1;k4;k++)printf(%d\n,ff(k));}则输出结果是________。A)1B)1C)1D)122226633244答案:B20.以下程序有语法性的错误,有关错误原因的正确说法是________。main(){intG,k;voidprt_char(int);......k=prt_charf(G)......}A)语句voidprt_char();有错,它是函数调用语句,不能用void说明B)变量名不能用大写字母C)函数说明和函数调用语句之间有矛盾;D)函数名不能使用下划线。答案:C二.填空题。1.设在主函数中有以下定义和函数调用语句,且fun函数为void类型;请写出fun函数的首部【1】。要求形参名为b。main(){doubles[10][22];intn;┆┆fun(s);┆}答案:【1】voidfun(doubles[][22])解析:本题中,为了明确表示“不带回值”,可以用“void”定义“无类型”(或称“空类型”)。这系统就保证不使函数带回任何值,二维数组的第一维可以省略。2.阅读下面程序,则程序执行后的结果为【2】。#includestdio.hmain(){inta=4,b=6,c=