第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
        考点:全局变量与局部变量。
        分析:在主函数中全局变量ab被同名的局部变量所覆盖,所以主函数中引用 ab是局部变量。
        答案: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
        考点:无参函数的调用。
        分析:这是一个无参函数的调用,在函数fi是一个静态变量,而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小时内删除。