代码能力(C&C++)试题
一、 选择题(每题4分,总共32分):
1、 以下对一维整形数组正确的是:______
A、 int a(10);
B、 int n = 10, a[n];
C、 int n; scanf(“%d”, &n); int a[n];
D、 #define SIZE 10
int a[SIZE];
2、 关于变量,正确的是:______
A、 若全局变量仅在单个C文件中访问,则可将此变量改为静态全局变量,以降低模块间耦合度;
B、 若全局变量仅在单个函数中访问,则可将此变量改为静态局部变量,以降低模块间耦合度;
C、 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
D、 静态全局变量过大,可能导致堆栈溢出;
3、 关于编译预处理的功能,包括但不限于:______
A、 语言的预处理功能是指完成宏替代和包含文件的调用;
B、 预处理指令只能位于源程序的首部;
C、 凡是源程序中行首以#标识的行指令都是预处理指令;
D、 语言的编译处理就是对源程序进行初步的语法检查;
4、 关于结构,正确的是:______
A、 结构占用空间大小不仅取决于结构成员的定义,还取决于结构成员的定义顺序以及结构的字节对齐方式;
B、 结构成员的排列顺序会影响结构成员数据的存取效率;
C、 功能太单一的结构会降低代码效率;
D、 结构中使用位域,既可节省空间,也能提高存取效率;
5、 关于函数参数,不正确的是:______
A、对参数输入和非参数输入都要检查有效性;
B、防止将函数的输入参数用作工作变量;
C、调用函数填写参数时,应尽量减少没有必要的默认数据类型转换或强制类型转换;
D、非调度函数应减少或防止控制参数,尽量不要使用数据参数;
6、 以下语句可读性较好的有:______
A、 rect.length = 0; char_poi = str; rect.width = 5;
B、 if(Trunk[index].trunk_state == 0){}
C、 word = (high << 8) | low;
D、 *++stat_poi+=1;
7、 以下程序的运行结果为:______
void sub(int x, int y, int *z)
{
*z = y - x;
}
int main(void)
{
int a, b, c;
sub(10, 5, &a);
sub(7, a, &b);
sub(a, b, &c);
printf(“%4d, %4d, %4d\n”, a, b, c);
}
A、-5 -12 -17
B、-5 -12 -7
C、5 2 3
D、5 -2 -7
8、以下程序的输出结果是:______
#define M 5
#define N M+M
void main()
{
int k;
k = N*N*5;
printf(“%d\n”, k);
}
A、500
B、55
C、125
D、100
二、 判断题(每题2分,总共16分):
1、【 】 char a[][2][3][4][5][6];这样的全局变量定义是允许的。
2、【 】 typedef在重定义类型上比#define安全。
3、【 】 任意两个类型的指针都可以进行<、>、>=、<=、==等比较。
4、【 】 公共变量时增加模块间耦合的原因之一,故应减少没有必要的公共变量以降低模块间耦合度。
5、【 】 数组比指针寻址存取效率高,因此推荐使用数组,少用指针。
6、【 】 递归调用使代码简洁,所以应该尽量多的使用;
7、【 】 只应该把函数、变量以及函数类型三种对象放置于extern “C”的内部;
8、【 】 同一软件产品内,应规划好接口部分标识符(变量、结构、函数、常量)的命名,防止编译、链接时产生冲突,如规定函数命名加与模块相关的前缀。
三、 问答题:
1、 以下程序是求一个数的平方,请指出错误之处并修改(6分)。
#define SQUARE(a) ((a)*(a))
int main(void)
{
int a = 5;
int b;
b = SQUARE(a++);
printf(“a=%d, b=%d\n”, a, b);
return 0;
}
2、请写出以下代码执行结果(10分)。
int inc(int a)
{
return (++a);
}
int multi(int *a, int *b, int *c)
{
*c = (*a) * (*b);
return (*c);
}
typedef int (FUNC1)(int in);
typedef int (FUNC2)(int *, int *, int *);
void show(FUNC2 fun, int arg1, int *arg2)
{
FUNC1 p = &inc;
int temp = p(arg1);
fun(&temp, &arg1, arg2);
printf(“%d\n”, *arg2);
}
int main(void)
{
int a;
show(multi, 10, &a);
return 0;
}
3、请找出以下代码错误,按编程规范重写之,并写出执行结果(18分)。
#include <string.h>
int main(void)
{
char *src=”hello world”;
char *dest=NULL;
int len=strlen(src);
dest=(char *)malloc(len);
char*d=dest;
char*s=src[len];
while(len--!=0)
d++=s--;
printf(“%s”,dest);
return 0;
}
4、请实现strcpy函数(18分)。
试题答案
选择题:
1、 D
2、 ABC
3、 C
4、 AB
5、 D
6、 C
7、 A
8、 B
判断题:
1、 F
2、 T
3、 F
4、 T
5、 F
6、 F
7、 T
8、 T
问答题:
1、
#define SQUARE(a) ((a)*(a))
int main(void)
{
int a = 5;
int b;
// b = SQUARE(a++);
b = SQUARE(a); // 第二个a取值为6
a++;
printf(“a=%d, b=%d\n”, a, b);
return 0;
}
2、110
3、
#include <string.h>
int main(void)
{
char *src = ”hello world”;
char *dest = NULL;
int len = strlen(src);
// dest=(char *)malloc(len);
dest = (char *)malloc(len+1); // 要’\0’分配一个字节空间
char*d = dest;
// char*s=src[len];
char*s = src[len-1]; // 指向最后一个字符
while(len--!=0)
{
d++=s--;
}
*d = 0; // 尾部要加’\0’
printf(“%s”,dest);
free(dest); // 使用完内存要释放,避免内存泄露
return 0;
}
4、
int strcpy(char *dst, char *src)
{
int ncount;
char *pdst, *psrc;
pdst = dst;
psrc = src;
ncount = 0;
while(pdst != NULL && psrc != NULL)
{
if(*psrc == 0)
{
*pdst = 0;
break;
}
*pdst++ = *psrc++;
ncount++;
}
return ncount;
}