第5章 函数
5.1典型考试题剖析
5.1.1选择题
【例1】下列程序执行后的结果是_______。
#include <stdio.h>
f(int a)
{
int b=0;
static c=3;
a=c++,b++;
return(a);
}
main()
{
int a=2,i,k;
for(i=0;i<2;i++)
k=f(a++);
printf("%d\n",k);
}
A) 3 B) 0 C) 5 D) 4
✧ 考点:变量的作用域。
✧ 分析:此题函数f中的变量c是一个静态变量。第一次调用函数时,使用的参数是a,值为2,进入子函数f内,变量b=0,c=3,然后语句“a=c++,b++;”是一个逗号表达式,不是赋值表达式,a被赋的值是c的值,不同逗号表达式的值,所以a=3,此时c的值同时变为4;第二次调用函数,使用的参数是a,值为3,进入子函数内,变量b=0,c=4(这是静态变量的特性)。
✧ 答案:D
【例2】下面程序的输出是_______。
int w=3;
fun(int k);
main()
{
int w=10;
printf("%d\n",fun(5)*w);
}
fun(int k)
{ if (k==0)
return(w);
return(fun(k-1)*k);
}
A) 360 B) 3600 C) 1080 D) 1200
✧ 考点:函数的递归调用和全局变量。
✧ 分析:此题涉及到了函数的递归调用和全局变量的用法,最容易出错的地方是变量w,程序首先定义了全局变量w,并赋了初值为3,然后在主函数中又定义了一个局
部变量w,并赋初值为10,在子函数中引用了变量w,一定要认清这个变量是全局变量w的值而不是主函数中局部变量w的值。
✧ 答案:B
【例3】有以下程序
#include <stdio.h>
int abc(int u,int v);
main()
{
int a=24,b=16,c;
c=abc(a,b);
printf("%d\n",c);
}
int abc(int u,int v)
{
int w;
while(v)
{ w=u%v;
u=v;
v=w;
}
return(u);
}
输出结果为 。
A) 6 B) 7 C) 8 D) 9
✧ 考点:函数的返回值。
✧ 分析:进入子函数后,循环共执行了三次:第一次结束后w=8,u=16,v=8;第二次结束后w=8,u=8,v=8;第三次结束后w=0,u=8,v=0。
✧ 答案:C
【例4】以下程序运行后,输出结果是_______。
int d=1;
fun(int p)
{ int d=5;
d+=p++;
printf("%d" ,d);
}
main()
{
int a=3;
fun(a);
d+=a++;
printf("%d\n" ,d);
}
A) 8 4 B) 9 9 C) 9 5 D) 4 4
✧ 考点:全局变量与局部变量。
✧ 分析:此题应注意全局变量d和函数fun中定义的局部变量d的作用范围,在子函数fun中全局变量d不起作用。
✧ 答案:A
【例5】以下程序的输出结果是_______。
int d=1;
fun(int p)
{ static int d=5;
d+=p;
printf("%d" ,d);
return(d);
}
main()
{
int a=3;
printf("%d\n" ,fun(a+fun(d)));
}
A) 699 B) 669 C) 61515 D) 6615
✧ 考点:函数的调用。
✧ 分析:先求fun(d)的值,调用参数为全局变量d,其值为1,进入子函数,参数d的值传给形参p,p的值为1,由于是第一次进入子函数,故静态变量d的值即为初始化的值5,执行语句“d+=p;”,得到d=6,输出第一个数值6,退出fun(d)的调用,返回函数值6到主函数中。再求fun(a+fun(d))的值,调用参数为“a+fun(d)”,其值为9,进入子函数,由于不是第一次进入子函数,故静态变量d的值是上一次调用后的结果,为6,执行语句“d+=
p;”,得到d=15,输出数值15,退出fun(d)的调用,返回函数值15到主函数中。执行主函数中的输出语句,输出函数调用fun(a+fun(d))的结果为15。
✧ 答案:C
【例6】有如下函数调用语句:
func(rec1,rec2+rec3,(rec4,rec5));
该函数调用语句中,含有的实参个数是_______。
A) 3 B) 4 C) 5 D) 有语法错
✧ 考点:实参。
✧ 分析:函数中有三个参数,分别是:一个变量rec1,一个算术运算表达式rec2+rec3,一个逗号表达式(rec4,rec5)。
✧ 答案:A
【例7】以下程序的输出结果是_______。
int a,b;
void fun()
{
a=100;
b=200;
}
main()
{
int a=5,b=7;
fun();
printf("%d%d\n" ,a,b);
}
A) 100200 B) 57 C) 200100 D) 75
✧ 考点:全局变量与局部变量。
✧ 分析:在主函数中全局变量a和b被同名的局部变量所覆盖,所以主函数中引用 的a和b是局部变量。
✧ 答案:B
【例8】以下程序的输出结果是_______ 。
int f()
c语言中逗号表达式的用法{ static int i=0;
int s=1;
s+=i;
i++;
return s;
}
main()
{
int i,a=0;
for (i=0;i<5;i++)
a+=f();
printf("%d\n",a);
}
A) 20 B) 24 C) 25 D) 15
✧ 考点:无参函数的调用。
✧ 分析:这是一个无参函数的调用,在函数f中i是一个静态变量,而s是一个局部变量,s的初值永远是1,而i的值第一次调用时是0,执行了i++之后,第二次调用时就是1,直到4。
✧ 答案:D
【例9】以下程序的输出结果是_______。
f(int b[],int m,int n)
{ int i,s=0;
for (i=m;i<n;i=i+2)
s=s+b[i];
return(s);
}
main()
{
int x,a[]={1,2,3,4,5,6,7,8,9};
x=f(a,3,7);
printf("%d\n",x);
}
A) 10 B) 18 C) 8 D) 15
✧ 考点:数组的调用。
✧ 分析:已知一维数组有9个值,用子函数求得从下标3开始到下标6的这4个数中下标为3,5这几个数之和。
✧ 答案:A
【例10】有以下程序
int f(int n)
{ if (n==1)
return(1);
else
return(f(n-1)+1);
}
main()
{
int i,j=0;
for (i=1;i<3;i++)
j+=f(i);
printf("%d\n",j);
}
程序运行后的输出结果是______。
A) 4 B) 3 C) 2 D) 1
✧ 考点:递归调用。
✧ 分析:此题是一个递归调用的题目,在子函数中当n!=1时,递归调用当前函数 f(n-1)。
✧ 答案:B
【例11】有以下程序
void f(int x ,int y)
{ int t;
if (x<y)
{
t=x;
x=y;
y=t;
}
}
main()
{
int a=4,b=3,c=5;
f(a,b);
f(a,c);
f(b,c);
printf("%d,%d,%d\n",a,b,c);
}
执行后输出的结果是_______ 。
A) 3,4,5 B) 5,3,4 C) 5,4,3 D) 4,3,5
✧ 考点:函数的返回值。
✧ 分析:此题想通过两两比较,求a,b,c三者之间从大到小的顺序,但是由于子函数没有返回值,所以子函数的结果不影响主函数,主函数中a,b,c的值依旧还是初始值4,3,5。
✧ 答案:D
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论