第4章 习题解答
一、选择题
1.在C语言中,函数返回值的类型最终取决于       
A)函数定义时的函数首部所说明的函数类型        B)return语句中表达式值的类型
C)调用函数时主调函数所传递的实参类型        D)函数定义时形参的类型
解析:函数返回值类型最终取决于定义函数时所定义的函数类型。
答案:A
2.设函数Fun()的定义形式为:
void Fun(char ch, float x){}
则以下对函数Fun()的调用语句中,正确的是       
A)Fun("abc", 3.0);            B)t = Fun('D', 16.5);
C)Fun('65', 2.8);            D)Fun(32, 32);
解析:选项A中"abc"是字符串,与形参不匹配:由于Fun函数的返回值类型为void,所以选项B中进行了赋值操作是不正确的;在选项C中,'65'是不合法的字符形式,单引号中应该是单个字符。只有选项D才是合法的函数调用形式。
答案:D
3.有以下程序:
/* 文件路径名:ex4_1_3\main.c */
#include <stdio.h>                    /* 标准输入/输出头文件 */
int f1(int x, int y) { return x > y ? x : y; }
int f2(int x, int y) { return x > y ? y : x; }
int main(void)                        /* 主函数main() */
{
    int a = 4, b = 3, c = 5, d = 2, e, f, g;        /* 定义变量 */
    e = f2(f1(a, b), f1(c, d)); f = f1(f2(a, b), f2(c, d));/* 调用函数 */
    g = a + b + c + d - e - f;                /* 算术运算 */
    printf("%d,%d,%d\n", e, f, g);        /* 输出e,f,g */
    return 0;                          /* 返回值0, 返回操作系统 */
}
程序运行后的输出结果是       
A)4,3,7        B)3,4,7        C)5,2,7        D)2,5,7
解析:函数f1用于求两个数中的最大数,而函数f2用于求两个数中的最小数。因此有:
e=f2(f1(a,b),f1(c,d))=f2(f1(4,3),f1(5,2))= f2(4,5)=4;
f=f1(f2(a,b),f2(c,d)) =f1(f2(4,3),f2(5,2)) =f1(3,2)=3;
g=a+b+c+d-e-f=4+3+5+2-4-3=7。
答案:A
4.若函数调用时的实参为变量,以下关于函数形参和实参的叙述中正确的是     
A)函数的实参和其对应的形参共占同一存储单元
B)形参只是形式上的存在,不会占用具体存储单元
C)同名的实参和形参占同一存储单元
D)函数的形参和实参分别占用不同的存储单元
解析:在C语言中,函数的形参和实参是分别占用不同的存储单元的,因此,选项D是正确的。
答案:D
c语言大学教程5.有以下程序:
/* 文件路径名:e4_1_5\main.c */
#include <stdio.h>                /* 标准输入/输出头文件 */
int a = 1;                        /* 全局变量 */
int f(int c)                        /* 定义函数 */
{
    static int a = 2;                /* 静态变量 */
    c++;                        /* c自加1 */                           
    return (a++) + c;                /* 返回函数值 */   
}
int main(void)                    /* 主函数main() */
{
    int i, k = 0;                    /* 定义变量 */
    for (i = 0; i < 2; i++)
    { int a = 3; k += f(a); }            /* 循环调用f()函数 */
    k += a;                    /* 将全局变量a的值加到k */
    printf("%d\n", k);                /* 输出k */
    return 0;                      /* 返回值0, 返回操作系统 */
}
程序的运行结果是     
A)14        B)15        C)16        D)17
解析:题中“static int a=2”定义了一个static局部变量,编译程序为其生成永久存储单元,在调用函数f()时,值一直都保存着,在主函数中,for循环进行两次,第一次循环得f(3)=2+3+1=6,从而k+=f(3)=6,第二次循环由于static局部变量a变成了3,从而f(3)=3+3+1= 7,故k+=f(3)=13,最后执行k+=a时,此时a的值为全局变量,其值为1,所以k的值为14,选项A是正确的。
答案:A
6.有以下程序:
/* 文件路径名:e4_1_6\main.c */
#include <stdio.h>                /* 标准输入/输出头文件 */
int a = 4;                        /* 全局变量 */
int f(int n)                        /* 定义函数 */
{
    int t = 0;                    /* 局部变量 */
    static int a = 5;                /* 静态变量 */
    if (n % 2) {int a = 6; t += a++; }
    else { int a = 7; t += a++; }
    return t + a++;                /* 返回函数值 */
}
int main(void)                    /* 主函数main() */
{
    int s = a, i;                    /* 定义变量 */
    for (i = 0; i < 2; i++) s += f(i);    /* 循环调用f()函数 */
    printf("%d\n", s);                /* 输出s */
    return 0;                      /* 返回值0, 返回操作系统 */
}
程序运行后的输出结果是       
A)24        B)28        C)32        D)36
解析:main()函数在开始时,s=a=4,其中的a为全局变量。
第1次循环时,i=0,f(i)=f(0),将0传递给形参n,首先执行if语句中的条件“n%2”;条件为假,则执行else下的复合语句“{ int a = 7; t += a++; }”,可知t=0+7=7,使用return返回t=7+(a++)=7+5=12,a运算完后自增1,变为6,这里的a为函数f()内,复合语句之外的a,返回主函数后s=4+12=16。
第2次循环时,当i=1时,f(i)=f(1),将1传递给形参n,首先执行if语句中的条件“n%2”;条件为真,则执行if下的得合语句“{ int a = 6; t += a++; }”,可知t=0+6=6,使用return返回t=6+(a++)=6+6=12,这里的a为函数f()内,复合语句之外的a,返回主函数后s=16+12=28。
答案:B
7.有以下程序:
/* 文件路径名:e4_1_7\main.c */
#include <stdio.h>            /* 标准输入/输出头文件 */
Fun(int x, int y)
{
    static int m = 0, i = 2;        /* 静态变量 */
    i += m + 1; m = i + x + y;    /* 对静态变量作赋值运算 */
    return m;                /* 返回函数值 */
}
int main(void)                /* 主函数main() */
{
    int j = 1, m = 1, k;        /* 定义变量 */
    k = Fun(j, m);            /* 调用函数Fun() */
    printf("%d,", k);            /* 输出k */
    k = Fun(j, m);            /* 调用函数Fun() */
    printf("%d\n", k);            /* 输出k */
    return 0;                  /* 返回值0, 返回操作系统 */
}
执行后的输出结果是     
A)5,5        B)5,11        C)11,11        D)11,5
解析:在第1次调用Fun()函数时,x=1,y=1,函数Fun()的静态变量i=2+0+1=3,m=3+1+1=5,返回m=5。在第2次调用Fun()函数时,x=1,y=1,函数Fun()的静态变量i=3+5+1=9,m=9+1+1=11,返回m=11。
答案:B
8.在一个C源程序文件中所定义的全局变量,其作用域为       
A)所在文件的全部范围            B)所在程序的全部范围
C)所在函数的全部范围            D)由具体定义位置和extern说明来决定范围
解析:全局变量的作用域不但从具体定义位置开始,直到文件结束为止,而且还可用extern声明来扩大作用域围,所以此选项D正确。
答案:D
9.在C语言中,函数的隐含存储类别是       
A)auto            B)static        C)extern        D)无存储类别
解析:C语言规定,函数的隐含存储类别为外部类型,即extern类型,允许其他文件中的函数调用。
答案:C
10.有以下程序:
/* 文件路径名:ex4_1_10\main.c */
#include <stdio.h>                /* 标准输入/输出头文件 */
int Fun(int x)
{
    if (x == 0 || x == 1) return 3;        /* 递归结束 */
    else return  x - Fun(x - 2);        /* 递归调用 */
}
int main(void)                    /* 主函数main() */
{
    printf("%d\n", Fun(7));            /* 输了Fun(7) */
    return 0;                      /* 返回值0, 返回操作系统 */
}
执行后的输出结果是       
A)7        B)3        C)2        D)0
解析:x=7,通过递归调用Fun()函数后得到Fun(7)= 7-Fun(5)= 7-(5-Fun(3)) =2+3-Fun(1)=2。
答案:C
*11.下面选项中不属于面向对象程序设计特征的是       
A)继承性        B)多态性        C)类比性        D)封装性
解析:面向对象技术有三个重要特性:封装性、继承性和多态性;而类比性不属于面向对象的特征。
答案:C
12.对于一个正常运行的C程序,以下叙述中正确的是       
A)程序的执行总是从main函数开始,在main函数结束
B)程序的执行总是从程序的第一个函数开始,在main函数结束
C)程序的执行总是从main函数开始,在程序的最后一个函数中结束
D)程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。