电子科技大学 c 语言复试试题
前言:本文为个人在准备 2020 研究生复试所总结。参考了王道群里的各种回忆版试题。感
谢各位前辈的贡献。下文除了参考各位前辈所写,还加入了一些个人理解。如有错误还望
指正。---------------------------------20 我还活着 20 烟酒僧
一 选择题
1.下面程序的输出结果是(
int x = 3;
do{
printf(“%d\n”,x -= 2);
}while(!(-- x));
)
解析:x 初始值为 3,第一次循环中运行 printf 函数,参数 x -= 2 的值为 1,输出
1,此时 x = 1,进行判断!(-- x),x 先自减 1,为 0,取非为 1(真),进行第二次
循环,x 先减 2,输出-2,此时 x=-2,判断!(-- x),x 先自减 1 为-3,取非为 0(假),
结束循环。所以输出结果为:
1
-2
2.下面程序的输出结果是(
void main(){
)
int a[]={1,7,12,15};
int *p1=a,*p2 = p1++;
*p1 += *p2++;
printf(“%d %d”,*p1,*p2);
解析:首先定义指针 p1 指向数组 a 首地址,然后定义指针 p2,也指向数组首地
址,然后 p1 自加,也就指向了数组第二个元素。*p1 += *p2++;语句先将 p2 指向
的第一个元素的值加到 p1 指向的第二个元素的值上,也就是第二个元素值为 8,
然后 p2 自加,指向第二个元素(*p2++,*与++优先级相同,从右自左结合,先
与++结合,表示语句执行完后 p2 指向下一个元素,然后与*结合,表示 p2 现在
所指向的第一个元素的值),所以最后输出结果为:8 8
3.下面程序的输出结果是(
int func(int *p){
)
return (*p-- = 3) - 1;//(*p-- = 3)可以拆成两步,*p=3; p--;
}
}
void main(){
int arr[]={10,7,5};
int *p = arr + 1;
printf(“%d”,func(p) + *p);
}
解析:p 指针首先指向数组 arr 的第二个元素,首先调用 func 函数,将实参指针
p 指向的地址传递给函数形参 p,形参执行*p-- = 3,使得 p 指向的数组第二个元
素值为 3,然后形参 p 自减指向第一个元素,但是实参 p 不变,还是指向第二个
元素,此时 func 返回的值为 3 - 1 = 2,然后 2 + *p,这里实参 p 指向第二个元素,
值为 3,所以结果为:5
4.下面程序的输出结果是(
void main(){
int i = 1;
switch(i){
)
printf("hello ");
case 1:printf("Hi ");
case 2:printf("Bye ");
}
}
解析:i 的值为 1,所以直接从 case 1 后面的语句开始执行,输出 Hi ,由于这里
没有 break;不会跳出 switch 语句,所以继续往下执行,输出 Bye ,所以最后结
果为:Hi Bye
5.下面程序的输出结果是(
void main(){
)
int a,b = 0;
static int c[10]={9,2,3,4,5,6,7,8,0,1};
for(a = 0;a < 10;a ++)
b += c[a];
printf("%d",b);
}
解析:程序遍历数组 c,将 c 的每个元素的值累加到 b 上,所以最后结果为:45
)
6.运行以下程序后文件的内容为(
void main()
{
char str[100];
FILE *p1,*p2;
gets(str);
p1 = fopen(str,”w”);
p2 = fopen(str,”w”);
fputc(‘A’,p1);
fputc(‘B’,p2);
fclose(p1);
fclose(p2);
}
解析:文件指针 p1,p2 分别打开文件,先使用 p1 往文件输出 A,p2 此时指向文
件头,所以用 p2 往文件输出 B,覆盖了原本的 A,所以文件中的内容为 B。
7.下面程序的输出结果是(
long fib(int n)
{
)
if(n > 2) return (fib(n - 1) + fib(n - 2));
else return 1;
}
void main(){
}
printf(“%d\n”,fib(3));
解析:调用 fib(3),由于 3>2,所以返回 fib(2)+fib(1),fib(2)和 fib(1)都返回 1,所
以最后结果为:2
8.下面程序的输出结果是(
void main()
{
)
char c = 48;
int i,mark = 01;
for(i = 0;i < 5;i ++)
{
printf(“%c”,c|mark);
mark = mark << 1;
}
}
解析:C=48 转换成二进制数就是 110000,mark 初始为八进制 1,循环执行 5 次,
每次先输出 c|mark(按位或运算)对应的 ASCII 字符,然后 mark 左移 1 位,即
乘以 2。第一次循环 c 为 110000,mark 为 1,c|mark 为 110001,即十进制 49,
对应 ASCII 字符‘1’,然后 mark 左移为 10;第二次循环 c|mark 为 110010,即
十进制 50,对应 ASCII 字符‘2’,然后 mark 左移为 100,以此类推,最后输出
为 12480。
9 程序如下,输出结果为:
输出结果:9
10 //这个题有些地方记不清,50 60 70 是我随便写的,不过不影响做题,考运算符优先级
struct Stu{
Int num;
Int score;
};
void main(){
struct Stu stu[3] = {{50,50}, {60,60}, {70,70}};
struct Stu *p;
p = stu[0];
}
问哪个选项是不对的?
选*p.num= 50,因为.的优先级高于*,而.是直接取值,改为(*p).num
11 程序如下:
swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = *a;
}
主函数中定义整型变量 x,y,则下⾯函数调⽤⽅式正确的是( )。
A. swap(&x, &y); B. swap(x, y);
C. swap(*x, *y); D. swap(y, x)
答案:A
12 以下程序片段:
int i, j, k;
i = 5; j = 10; k = 1;
printf("%d;%d\n", k>i
ii || i13 以下程序片段:
int main() {
char *point[] = {"one", "two", "three", "fourth"};
point[2] = point[3];
point[2] += 2;
printf("%s", point[2]++);
return 0;
}
输出结果为( )。
A. ee B. rth C. ree D. urth
答案 D
解析:首先从 point 处开始,先与[]结合,因为其优先级[ ]比*高,所以 point 是一
个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与 char 结合,
说明指针所指向的内容的类型是字符的,所以 point 是一个由返回字符串型数据
的指针所组成的数组。再看题,point[2] = point[3];就是让 point[2]指针指向
point[3]指向的元素即为 fourth。然后 point[2] += 2;也就是指针移动两个地址。
指向 fourth 中的 u,最后 printf("%s", point[2]++);先输出 point[2]指向的字符串,
urth,再地址+1。
14 下列⼀维数组定义中,错误的是( )。
A. int dat[] = {1, 2, 3};
B. int len = 5, dat[len];
C. int dat[5];
D. int dat[5] = {1, 2, 3};
答案:B(其实按照新标准 B 没错)
15
long fib(int n) {
return (fib(n - 1) + fib(n - 2));
if (n > 2)
{
} else
{
}
return (2);
}
void main()
{
printf("%d", fib(3));
}
输出结果为( )。
A. 2 B. 4 C. 6 D. 8
答案:B
16 以下能正确计算 s=1*2*3*4*5*6*7*8*9*10 的程序段是( )。
A. do {i = 1; s = 1; s = s * i; i++;} while(i <= 10);
B. do {i = 1; s = 0; s = s * i; i++;} while(i <= 10);
C. i = 1; s = 1; do {s = s * i; i++;} while(i <= 10);
D. i = 1; s = 0; do {s = s * i; i++;} while(i <= 10);
答案:C
17 下列程序执⾏后的输出结果是( )。
void reverse(int a[], int n) {
int i, t;
for (i = 0; i < n; i++)
{
t = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = t;
}
}
int main()
{
int b[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i, s = 0;
reverse(b, 8);
for (i = 6; i < 10; i++)
{
s += b[i];
}
return 0;
}
A. 22 B. 24 C. 26 D. 28
本题题⽬出错,⽆论选什么选项均得分
注:本题 reverse 函数的原意是反转指定长度的部分数组,但是 for 循环终⽌条
件写错,导致本道题出错。
怎么改正确呢!把 reverse 函数 for 循环的 n 改成 n/2,然后主函数,加一个
printf(“%d”,s)答案就为 22 了选 A
18 下列程序执⾏后的输出结果是( )。
void func(int *a, int b[]){
b[0] = *a + 6;
}
void main()
{
int a, b[5] = {0};
a = 0;
b[0] = 3;
func(&a, b);
printf("%d\n", b[0]);
}
B. 7
A. 6
答案:A
C. 8
D. 9
19
int i, j;
i = 3 / 2 + 7 / 2 == 5;
j = 45 % 11 + (((7 > 8) ? 15 : 14) == 14);
后变量 i, j 的值应为( )。
A. i = 0 j = 1
答案:C
B. i = 1 j = 1
C. i = 0 j = 2
20 执⾏下列程序段后,输出的结果是( )。
int x = 9;
do{
printf("%d", x--);
}while (!x);
B. 9
A. 8
C. 不输出任何内容 D. 陷⼊死循环
D. i = 1 j = 2
C. 7
B. 8
答案:B
21 设 i、j 和 k 都是 int 型变量,且 i = 7,j = 8,k = 9,则表达式(i * j) /
k + 6 - 15 % k 的值是( )。
A. 9
D. 6
答案:D
解析:原式 = 56/9+6-6=6
22 把 316 表⽰为两个加数的和,使两个加数分别能被 13 和 11 整除。
void main() {
int i = 0, j, k;
do{
i++;
k = 316 - 13 * i;
} while (
j = k / 11;
printf("316 = 13 * %d + 11 * %d\n", i, j);
);
C. 6
D. 0
B. 5
B. k % 11
D. k % 11 == 0
C. k / 11 == 0
}
A. k / 11
答案:B
23 如果 char cc[] = "12345", 则 strlen(cc)的值应为( )。
A. 7
答案:B
24 若有以下定义和语句:
struct student {
int age;
int num;
};
struct student stu[3] = { {15, 100}, {16, 90}, {15, 80} };
void main()
{
struct student *p = stu;
...
}
则以下不正确的是( )。
A. (p + 1) -> num = 200;
B. p++
C. *p.num = 200;
D. p = stu;
答案:C,应该(*p).num = 200;
25 关于 C 程序的叙述,错误的说法是()
A. C 程序总是从主函数开始执行
B. C 程序中定义的第一个函数是主函数
C. 在主函数中可以调用其他函数
D. 一个 C 程序可以包括多个函数
答案:B
26 设 a、b 和 c 都是 int 型变量,且 a=7,b=8,c=9,则表达式(a*b)/c+6-14%c
的值是()
A.6
B.7
答案:B
C.8
D.9
27 下列一维数组说明中,错误的是()
A. int a[]={1,2,3};
B. int a[5];
C. int n=5, a[n];
D. int a[5]={1,2,3};
答案:C
28 设有定义 int a,*p;下列赋值语句中,正确的是()
A. p=a;
D.*p=&a;
B.p=&a;
C.p=*a;