高级语言程序设计(C)模拟题四一、选择题(本题共20道小题,每题2分,共40分。
)1.以下有4组用户标识符,其中合法的一组是()。
A) For -sub Case B) 4d DO SizeC) f2_G3 IF abc D) WORD void define答案:C解析:标识符的命名规则:由字母、数字、下划线组成,第一个字符必须是字母或者下划线,标示符的命名不能同C语言的关键字相同。
2. 若有下面的程序片段:int a[12]={0}, *p[3], **pp, i;for(i=0; i<3; i++)p[i]=&a[i*4];pp=p;则对数组元素的错误引用是A) pp[0][1] B) a[10] C) p[3][1] D) *(*(p+2)+2) 答案:C解析:A. pp[0]表示p[0]的地址,而pp[0]也为一个指针,它和pp用法相同,故pp[0][1]则表示a[1]的地址,正确。
B.正确。
C.数组p的最大下标为2,错误。
D. *(*(p+2)+2)表示a[10],正确。
3. 若要求在if后一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表达式为A) a<>0 B) !aC) a=0 D) a答案:D解析:对if(a)而言,如果a的值不为0,则if语句括号中表达式的值不为0,if为真,选D。
4. 若已定义:int a[ ]={0,1,2,3,4,5,6,7,8,9], *p=a,i;其中0≤i≤9, 则对a数组元素不正确的引用上A) a[p-a] B) *(&a[i]) C) p[i] D) a[10]答案:D解析:A. a[p-a]表示a[0],正确。
B. *(&a[i])表示a[i],正确。
C. p[i]表示&a[i],正确。
D. a数组最大下标为9,错误。
5. 以下程序的输出结果是int main( ){ int x=10,y=10,I;for(i=0;x>8;y=++i)printf("%d,%d ",x--,y);}A) 10 1 9 2 B) 9 8 7 6 C) 10 9 9 0 D) 10 10 9 1答案:D解析:第一遍循环: x=10,y=10,x>8,输出 10 10后,x=9,y=1.第二遍循环:x=9>8,输出 9 1 后x=8,y=2。
第三遍循环:x=8,不满足条件,循环结束,无输出。
6. 下面程序的输出是void prtv(int *x)printf("%d\n", ++*x);}int main(){ int a=25;prtv(&a);return 0;}A) 23 B) 24C) 25 D) 26答案:D解析:主函数传递给prtv函数的x值为25 ,在printf中,先对x自增,再输出x值为26。
7. 下面能正确进行字符串赋值操作的语句是A)char s[5]={"ABCDE"}; B)char s[5]={'A'、'B'、'C'、'D'、'E'};C) char *s;s="ABCDEF"; D)char *s; scanf("%s",s);答案:C解析:A. {}中的’“’也作为字符串中的一个字符,故右侧字符串长度为7>5,越界,错误。
B. 右侧字符的分割符应使用‘,’,而不是‘、’,错误。
C. 正确。
D. s是一个字符串常量,应在定义同时初始化且不能通过scanf函数或任何其他方式修改其值,错误。
8. 设x,y,z,t均为int型变量,则执行以下语句后,t的值为x=y=z=1;t=++x||++y&&++z;A)不定值 B)2 C)1 D)0答案:C解析: ||和&&运算符的优先级高于赋值运算符=,所以t为一个逻辑值,其只能为0或1,又表达式++x||++y&&++z为真,故t=1。
9. 设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行的语句是A)k=*p1+*p2;B)p2=k;C)p1=p2;D)k=*p1 *(*p2);答案:B解析:B中不能将一个整形变量的值赋给一个指针变量,应改为p=&k 或者*p=k。
10. 请读程序:#include<stdio.h>#define SUB(X,Y) (X)*Yint main(){int a=3, b=4;printf("%d", SUB(a++, b++));return 0;}上面程序的输出结果是A) 12 B) 15C) 16 D) 20答案:A解析:printf函数中输出的内容等价于(a++)*b++,由于自增运算符优先级高于*,所以又等价于(a++)*(b++),应先输出a*b,后进行自增运算。
11. sizeof(float)的结果是:A) 4B) 6C) 8D)不确定答案:D解析:sizeof操作符用来测定数据类型位长,但在不同的系统中,同一数据类型的位长并不一定相同,故不确定,选D。
12. 若执行下面的程序时从键盘上输入3和4,则输出是int main(){int a,b,s;scanf("%d %d",&a,&b);s=a;if(a<b)s=b;s=s*s;printf("%d\n",s);return 0;}A) 14 B) 16 C) 18 D) 20答案:B解析:scanf输入a=3,b=4,s=a=3,a<b,if条件成立,s=b=4,s=s*s=16,输出s=16,选B。
13. 以下程序的输出结果是# include <stdio.h>int main(){printf("%d\n",NULL);return 0;}A) 不确定的(因变量无定义) B)0 C)-1 D)1答案:B解析:NULL实际上为系统定义的一个符号常量,它的值就为0,所以输出0,选B。
14. 读程序:#include<stdio.h>f(char *s){char *p=s;while( *p!='\0') p++;return(p-s);}int main(){printf("%d\n",f("ABCDEF"));return 0;}上面程序的输出结果是A) 3 B) 6 C) 8 D) 0答案:B解析:’\0’为字符串结束标志,t函数的作用实际为统计参数字符串的长度并返回给主函数,所以输出结果为字符串长度6,选B。
15. 在下列叙述中,正确的一条是()。
A) 以下语句是正确的:char c[]=”ab”;B) 一维数组的定义可采用下列格式:int a(10);C) 下面的语句定义了一个二维数组:float a[3,4];D) 以下两个语句中的a[3][4]的含义相同:int a[3][4]; a[3][4]=1;答案:A解析:C语言数组可以在定义时用字符串赋初值,故答案为A。
其他项均不符合C语言关于数组的定义格式。
16. 若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是A) *p=&a; scanf("%ld",p);B) p=(long *)malloc(8); scanf("%ld",p);C) scanf("%ld",p=&a);D) scanf("%ld",&a);答案:A解析:A中*p=&a;赋值语句错误,应改为p=&a;,才可以将p指针指向变量a,选A。
17. 若已定义:int a[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1] 地址的表达式是A) p+1 B) a+1 C) a++ D) ++p答案:C解析:a为常量指针,不能修改其值,故不能使用自增运算符,选C。
18. 下面程序的输出是int main(){enum team {my,your=4,his,her=his+10};printf("%d %d %d %d\n",my,your,his,her);return 0;}A) 0 1 2 3 B) 0 4 0 10 C) 0 4 5 15 D) 1 4 5 15答案:C解析:枚举元素my没有赋初值系统自动赋值为0,同理,枚举元素his没有赋初值,根据枚举元素赋值规则,系统将his的值赋为它前面的your的值+1,选C。
19. 以下程序输出结果是int main( ){int m=5;if(m++>5)printf("%d\n",m);else printf("%d\n",m--);return 0;}A)7 B)6 C)5 D)4答案:B解析:主函数第二行中if条件先判断m>5不成立,然后有m=m++=6,再执行else语句,其中,先输出m=6,再使m自减为5,选B。
20. 以下程序运行后,输出结果是 int d=1;fun(int p){int d=5;d+=p++;printf("%d",d);}int main(){int a=3;fun(a);d+=a++;printf("%d\n",d);return 0;}A)84 B)99 C)95 D)44答案:A解析:主函数调用fun的同时,将实参a的值3传递给形参p,fun函数中,p=3,d+=p++;语句可以拆分为 d=d+p;p++;所以d=8,输出8。
子函数调用结束回到主函数中,fun 函数中对形参p的值的修改不能改变实参a的值仍为3,d=d+a=4,输出4,选A。
二、填空题(本大题共7小题,每题2分,共14分。
)1. 在C语言中,一个函数的函数体一般包括_______和_______。
答案:声明部分执行部分解析:函数结构构成规则。
在C语言中,一个函数的函数体一般包括声明部分和执行部分。
2. 在C语言中,不同级运算符之间运算次序存在_________的区别,同级运算符之间运算次序存在________的规则。
答案:先后结合性解析:不同级的运算符由优先级规定运算次序;同级的运算符的运算顺序由结合性决定。
3. 欲将字符串S1复制到字符串S2中,其语句是 ____________ 。