1、2008 年 9月国家二级( C语言)笔试真题试卷及答案与解析 1 个栈的初始状态为空。现将元素 1、 2、 3、 4、 5、 A、 B、 C、 D、 E依次入栈,然后再依次出栈则元素出栈的顺序 _。 ( A) 12345ABCDE ( B) EDCBA54321 ( C) ABCDE12345 ( D) 54321EDCBA 2 下列叙述中正确的是 _。 ( A)循环队列中有队头和卧尾两个指针,因此,循环队列是非线牲结构 ( B)在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况 ( C)在循环队列中, 只需要队尾指针就能反映队列中元素的动态变化情况 ( D)循环队列中元素的个数是
2、由队头指针和队尾指针共同决定 3 在长度为 n的有序线性表中进行二分查找,最坏情况下需要比较的次数是 ( A) O(n) ( B) O(n2) ( C) O(log2n) ( D) O(nlog2n) 4 下列叙述中正确的是 _。 ( A)顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的 ( B)顺序存储结构只针对线性结构,链式存储结构只针对非线性结构 ( C)顺序存储结构能存储有序表,链式存储结构不能存 储有序表 ( D)链式存储结构比顺序存储结构节省存储空间 5 数据流图中带有箭头的线段表示的是 _。 ( A)控制流 ( B)事件驱动 ( C)模块调用 ( D)数据流
3、6 在软件开发中,需求分析阶段可使用的工具是 _。 ( A) N-S图 ( B) DFD图 ( C) PAD图 ( D)程序流程图 7 在面向对象方法中,不属于 “对象 ”基本特点的是 _。 ( A)一致性 ( B)分类性 ( C)多态性 ( D)标识唯一性 8 一间宿舍可住多个学生,则实体宿舍和学生之间的联系 是 _。 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在数据管理技术发展的三个阶段中,数据共享最好的是 _。 ( A)人工管理阶段 ( B)文件系统阶段 ( C)数据库系统阶段 ( D)三个阶段相同 10 有三个关系 R、 S和 T如下:由关系 R和 S通过运算
4、得到关系 T,则所使用的运算为 _。( A)笛卡尔积 ( B)交 ( C)并 ( D)自然连接 11 以下叙述中正确的是 _。 ( A) C程序的基本组成单位是语句 ( B) C程序中的每行只能写 一条语句 ( C)简单 C语句必须以分号结束 ( D) C语句必须在一行内写完 12 计算机能直接执行的程序是 _。 ( A)源程序 ( B)目标程序 ( C)汇编程序 ( D)可执行程序 13 以下选项中不能作为 C语言合法常量的是 _。 ( A) cd ( B) 100000 ( C) a ( D) 011 14 以下选项中正确的定义语句是 _。 ( A) double a;b; ( B) do
5、uble a=b=7; ( C) double a=7,b=7; ( D) double,a,b; 15 以下不能正确表示代数式 的 C语言表达式是 _。 ( A) 2*a*b/c/d ( B) a*b/c/d*2 ( C) a/c/d*b*2 ( D) 2*a*b/c*d 16 C源程序中不能表示的数制是 _。 ( A)二进制 ( B)八进制 ( C)十进制 ( D)十六进制 17 若有表达 (W)?(-x):(+y),则其中与 W等价的表达式是 _。 ( A) w=1 ( B) w=0 ( C) w!=1 ( D) w!=0 18 执行以下程序段后, W的值为 _。 int w=A,x=1
6、4,y=15 w=(xy) ( A) -1 ( B) NULL ( C) 1 ( D) 0 19 若变量已正确定义为 int型,要通过语句 scanf(“%d,%d,%d“, a=10; b=50; c=30; if(ab)a=b, b=c; c=a; printf(“a=%d b=%d c=%dn“,a,b,c); 程序的输出结果是 _。 ( A) a=10 b=50 c=10 ( B) a=10 b=50 c=30 ( C) a=10 b=30 c=10 ( D) a=50 b=30 c=50 21 若有定义语句: int m=5,4,3,2,1,i=4;,则下面对 m数组元素的引用中错误
7、的是 _。 ( A) m-i ( B) m2*2 ( C) mm0 ( D) mmi 22 下面的函数调用语句中, func函数的实参个数是 _。 func(f2(v1,v2),(v3,v4,v5),(v6,max(v7,v8); ( A) 3 ( B) 4 ( C) 5 ( D) 8 23 若有定义语句: double x5=1.0,2.0,3.0,4.0,5.0, *p=x;则错误引用 x数组元素的是 _。 ( A) *p ( B) x5 ( C) *(p+1) ( D) *x 24 若有定义语句: char s10=“123456700“;,则 strlen(s)的值是 _。 ( A)
8、7 ( B) 8 ( C) 9 ( D) 10 25 以下叙述中错误的是 _。 ( A)用户定义的函数中可以没有 return语句 ( B)用户定义的函数中可以有多个 return语句,以便可以调用一次返回多个函数值 ( C)用户定义的函数中若没有 return语句,则应当定义函数为 void类型 ( D)函数的 return语句中可以没有表达式 26 以下关于宏的叙述中正确的是 _。 ( A)宏名必须用大写字母表示 ( B)宏定义必须位于源程序中所有语句之前 ( C)宏替换没有数据类型限制 ( D)宏调用比函数调用耗费时间 27 有以下程序 #include stdio.h main() i
9、nt i,j; for(i=3;i =-1;i-) for(i=1;j =2;j+) printf(“%d“,i+j); printf(“n“); 程序的运行结果是 _。 ( A) 234 345 ( B) 432 543 ( C) 23 34 45 ( D) 45 34 23 28 有以下程序 #include stdio.h mare() int x=1,y=2,z=3; if(x y) if(y z) printf(“%d“,+z); else printf(“%d“,+y); printf(“%dn“,x+); 程序的运行结果是 _。 ( A) 331 ( B) 41 ( C) 2 (
10、 D) 1 29 有以下程序 #include stdio.h main() int i=5; do if(i%3=1) if(i%5=2) printf“*%d“,i); break; i+; while(i!=0); printf(“n“); 程序的运行结果是 _。 ( A) *7 ( B) *3*5 ( C) *5 ( D) *2*6 30 有以下程序 #include stdio.h int fun(int a, int b) if(b=0) return a; else return(fun(-a,-b); main() printf(“%dn“,fun(4,2); 程序的运行结果是
11、 _。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 31 有以下程序 #include stdio.h #include stdlib.h int fun(int n) int *p; p=(int*)malloc(sizeof(int); *p=n; return *p; int a; a=fun(10); printf(“%dn“,a+fun(10); 程序的运行结果是 _。 ( A) 0 ( B) 10 ( C) 20 ( D)出错 32 有以下程序 #include stdio.h void fun(int a, int b) int t; t=a; a=b; int c1
12、0=1,2,3,4,5,6,7,8,9,0,i; for(i=0;i 10;i+=2) fun(ci,ci+1); for(i=0;i 10;i+) printf(“%d,“,ci); printf(“n“); 程序的运行结果是 _。 ( A) 1,2,3,4,5,6.7,8,9,0, ( B) 2,1.4.3.6,5.8,7,0,9, ( C) 0,9,8,7,6,5,4,3,2,1, ( D) 0,1,2,3,4,5,6,7,8,9, 33 有以下程序 #include stdio.h struct st int x,y; data2=1,10,2,20; main() struct st
13、 *p=data; printf(“%d,“,p- y); printf(“%dn“,(+p)- x); 程序的运行结果是_。 ( A) 10,1 ( B) 20,1 ( C) 10,2 ( D) 20,2 34 有以下程序 #include stdio.h void fun(int a,int n) int i,t; for(i=0;i n/2;i+) t=ai; ai=an-1-i; an-1-i=t; main() int k10=1,2,3,4,5,6,7,8,9,10,i; fun(k,5); for(i=2;i 8;i+) printf(“%d“,ki); printf(“n“);
14、 程序的运行结果是 _。 ( A) 345678 ( B) 876543 ( C) 1098765 ( D) 321678 35 有以下程序 #include stdio.h #define N 4 void fun(int aN,int b) int i; for(i=0;i N;i+) bi=aii; main() int xN=1,2,3,4,5,6,7,8,9,10 ,YN,i; fun(x,y); for(i=0;i N;i+) printf(“%d,“,yi); printf(“n“); 程序的运行结果是 _。 ( A) 1,2,3,4, ( B) 1,0,7,0, ( C) 1,
15、4,5,9, ( D) 3,4,8,10, 36 有以下程序 #include stdio.h int fun(int (*s)4,int n,int k) int m,i; m=s0kl; for(i=1;i n;i+) if(sik m) m=sik; return m; main() int a44=1,2,3,4,11,12,13,14, 21,22,23,24, 31,32,33,34; printf(“%dn“,fun(a,4,0); 程序的运行结果是 _。 ( A) 4 ( B) 34 ( C) 31 ( D) 32 37 有以下程序 #include stdio.h main(
16、) struct STUchar name9;char sex;double score2; sturt STU a=“Zhao“ ,m,85.0,90.0,b=“Qian“ ,f,95:0,92.0; b=a; printf(“%s,%c,%2.0f,%2.0fn“,b.name,b.sex,b.score0,b.score1); 程序的运行结果是 _。 ( A) Qian,f,95,92 ( B) Qian,85,90 ( C) Zhao,f,95,92 ( D) Zhao,m,85,90 38 假定已建立以下链表结构,且指针 p和 q已指向如图所示的结点:则以下选项中司将 q所指结点从链
17、表中删除并释放该结 点的语句组是 _。 ( A) (*p).next=(*q).next; free(p); ( B) p=q- next; free(q); ( C) p=q; free(q); ( D) p- next=q- next; free(q); 39 有以下程序 #include stdio.h main() char a=4; printf(“%d/n,a=a 1); 程序的运行结果是 _。 ( A) 40 ( B) 16 ( C) 8 ( D) 4 40 有以下程序 #include stdio.h main() FILE*pf, char *s1=“China“,*s2=“
18、Beijing“; pf=fopen(“abc.dat“,“wb+“); fwrite(s2,7,1,pf); rewind(pf); /*文件位置指针回到文件开头 */ fwrite(s1,5,1,pf); fclose(pf); 以上程序执行后 abc.dat文件的内容是 _。 ( A) China ( B) Chinang ( C) ChinaBeijing ( D) BeijingChina 41 对下列二叉树进行中序遍历的结果是【 】。42 按照软件测试的一般步骤,集成测试应在【 】测试之后进行。 43 软件工程三要素包括方法、工具和过程,其中,【 】支持软件开发的各个环节的控制和管
19、理。 44 数据库设计包括概念设计、【 】和物理设计。 45 在二维表中,元组的【 】不能再分成更小的数据项。 46 设变量 a和 b已正确定义并赋初值。请写出与 a=a+b等价的赋值表达式【 】。 47 若整型变量 a和 b中的值分别为 7和 9,要求按以下格式输出 a和 b的值: a=7 b=9 请完成输出语句: printf(“【 】 “,a,b);。 48 以下程序的输出结果是【 】。 #include stdio.h main() int i,j,sum; for(i=3;i =-1;i-) (sum=0; for(j=1;j =i;j+) sum+=i*j; printf(“%dn
20、,sum); 49 以下程序的输出结果是【 】。 #include stdio.h main() int j,a=1,3,5,7,9,11,13,15,*P=a+5; for(j=3; j;j-) switch(i) case 1: case 2: printf(“%d“,*p+); break; case 3: printf(“%d“,* (-p); 50 以下程序的输出结果是【 】。 #include stdio.h #define N 5 int fun(int *s,int a,int n) int j; *s=a j=n; while(a!=sj) j-; return j; mai
21、n() int sN+1; int k: for(k=1 ;k =N;k+) sk=k+1: print f(“%dn“,fun(s,4,N); 51 以下程序的输出结果是【 】。 #include stdio.h int fun(int x) static int t=0; return(t+=x); main() int s,i; for(i=1 ;i =5;i+) s=fun(i); printf(“%dn“,s); 52 以下程序按下现指定的数据给 x数组的下三角置数,并按如下形式输出,请填空。 4 3 7 2 6 9 1 5 8 10 #include stdio.h main()
22、int x44,n=0,i,j; for(j=0;j 4;j+) for(i=3;i j;【 】 ) n+;xij=【 】 : for(i=0;i 4;i+) for(j=0;j =i;j+) printf(“%3d“,xij); printf(“n“); 53 以下程序的功能是:通过函数 func输入字符并统计输入字符的个数。输入时用字符作为输入结束标志。请填空。 #include stdio.h long【 】 ; /*函数说明语句 */ main() long n; n=func(); printf(“n=%1dn“n); long func() long m; for( m=0;get
23、char()!=【 】 ; return m; 2008 年 9月国家二级( C语言)笔试真题试卷答案与解析 1 【正确答案】 B 【试题解析】 栈是一种特殊的线 性表,这种线性表只能在固定的一端进行插入和删除操作,允许插入和删除的一端称为栈顶,另一端称为栈底。一个新元素只能从栈顶一端进入,删除时,只能删除栈顶的元素,即刚刚被插入的元素。这表明栈的运算规则是 “先进后出 ”(或称 “后进先出 ”)。在栈顶进行插入运算,称为进栈(或入栈 ),在栈顶进行删除运算,称为退栈 (或出栈 )。本题中,依次进栈,即依次插入元素 1、 2, 3、 4、 5、 A、 B、 C、 D、 E,依次出栈,即依次删除
24、元素,根据栈 “先进后出 ”的规则,应该以倒序出栈。即元素出栈顺序为 EDCBA54321。 2 【正确答案】 D 【试题解析】 所谓循环队列,就是将队列存储空间的最后一个位置绕到第 1个位置,形成逻辑上的环状空间,供队列循环使用。所以循环队列还是属于线性结构,所以选项 A是错误的。循环队列的头指针 front指向队列的第一个元素的前一位置,队尾指针 rear指向队列的最后一个元素,循环队列的动态变化需要头尾指针共同反映,所以选项 B、 C是错误的。循环队列的长度是: (sq.rear-sq.front+maxsize)%maxsize,所以循环队列的长度是由队头和队尾指针共同决定的,所以选项
25、 D正确。 3 【正确答案】 C 【试题解析】 二分法检索要求线性表结点按关键值排序且以顺序方式存储。在查找时,首先与表的中间位置上结点的关键值比较,若相等则检索成功;否则根据比较结果确定下一步在表的前半部分或后半部分继续进行。二分法检索的效率比较高,设线性表有 n 个元素,则最多的检索次数为大于 long2n(2为底数 )的最小整数,最少的检索次数为 1。 4 【正确答案】 A 【试题解析】 顺序存储结构就是用一组地址连续的存储单元依次存储该线性表中的各个元素,链式存储结构中各数据结点的存储序号是不连续的,并且各结点在存储空间中 的位置关系与逻辑关系也不一致,所以选项 A是正确的。两者都可以
26、存储线性的、有序的逻辑结构,所以选项 B、 C不正确。顺序结构使用的是连续物理空间,链式结构可以使用零散的物理空间存储,链式结构更灵活,不存在谁节约空间的说法,所以选项 D不正确。 5 【正确答案】 D 【试题解析】 数据流图是描述数据处理过程的工具,是需求理解的逻辑模型的图形表示,它直接支持系统的功能建模。数据流图从数据传递和加工的角度,来刻画数据流从输入到输出的移动变换过程。数据流图中的主要图形元素与说明如下: 加工 (转换 ):输入数据经加工变换 产生输出。 数据流:沿箭头方向传送数据的通道,一般在旁边标注数据流名。 存储文件 (数据源 ):表示处理过程中存放各种数据的文件。 源,潭:表
27、示系统和环境的接口,属系统之外的实体。 6 【正确答案】 B 【试题解析】 软件开发阶段包括需求分析、总体设计、详细设计、编码和测试 5个阶段。其中需求分析阶段常用的工具是数据流图 (简称 DFD)和数据字典 (简称DD)。常见的详细设计的图形描述工具主要有程序硫程图、 N-S 结构图、问题分析图 (简称 PAD图 )。 7 【正确答案】 A 【试题解析】 面向对象方法 中最基本的概念是对象,它的基本特点有:标识唯 性、分类性、多态性、封装性和模块独立性好。 8 【正确答案】 B 【试题解析】 两个实体间的联系可以归纳为 3种类型: 一对一联系:一对一的联系表现为主表中的每一条记录只与相关表中
28、的一条记录相关联。 一对多联系或多对一:一对多的联系表现为主表中的每一条记录与相关表中的多条记录相关联。 多对多联系:多对多的联系表现为一个表中的多个记录在相关表中同样有多个记录与其匹配。 一间宿舍可以住多个学生,但每个学生只能住一个宿舍,所以实体宿舍和学生之间的联系为一对多的 联系。 9 【正确答案】 C 【试题解析】 数据库管理发展至今已经历了三个阶段:人工管理阶段、文件系统阶段和数据库系统阶段。 人工管理阶段的特点:数据不保存、数据不独立、数据不能共享、数据无结构,没有专门的数据管理软件。 文件系统阶段的特点:数据可以长期保存,有专门的数据管理软件 文件系统。但是数据独立性低,共享性差、
29、冗余度大,数据记录内有结构,整体无结构。 数据库系统阶段的特点:数据结构化,数据独立性高,数据共享性高,冗余度小,易于 扩充,数据库管理系统提供统一的数控制功能,包括数据安全性、完整性、并发控制和数据恢复功能。 10 【正确答案】 D 【试题解析】 笛卡尔积:设关系 R和 S 的元数分别是 r和 s,定义 R和 S 的笛卡尔积是一个 (r+s)元元组集合,每一个元组的前 r个分量来自 R的一个元组,后 s个分量来自 S的一个元组。若 R有 k1个元组, s有 k2个元组,则关系 R和关系 S的广义笛卡尔积有 k1k2个元组。 交:设关系 R和关系 S 具有相同的目 n,且相应的属性诹自同一个域
30、,则关系 R与关系 S 的交由属于 R又属于 S的所有元组组成。 并:设关系 R和关系 S 具有相同的目 n(即两个关系都有 n个属性 ),且相应的属性取自同一个域,则关系 R与关系 S 的并由属于 R或属于 S的元组组成。 自然连接:是一种特殊的等值连接,它要求两个关系中进行比较的分量必须有相同的属性组,并且要将结果中重复的属性去掉。 11 【正确答案】 C 【试题解析】 C程序是由函数构成的。 个 C源程序至少包含 个 main 函数,也可以包含 个 main 函数和若干个其他函数。因此,函数是 C程序的基本单位,故选项 A错误; C程序书写格式自由, 行内可以写几个语句, 个语句可以分写
31、在多行上,故选项 B, D错误; C语言规定,每个语句和数据定义的最后必须有个分号,分号是 C语句的必要组成部分,故选项 C正确。 12 【正确答案】 D 【试题解析】 我们把由高级语言编写的程序称为 “源程序 ”,由二进制代码表示的程序称为 “目标程序 ”,由汇编语言编写的程序称为 “汇编程序 ”。对于计算机本身来说,它并不能直接识别由高级语言编写的程序,只能识别和执行由 0和 1组成的二进制指令。为了把源程序转换成机器能接受的目标程序,软件工作者编制了一系列软件,通过这些软件可以把用户按规定语法写出的语句 翻译成二进制的机器指令,这 种具有翻译功能的软件称为 “编译程序 ”。然后将编译后的
32、目标程序与系统的函数库和其他目标程序连接起来,形成可执行程序由计算机直接执行。 13 【正确答案】 A 【试题解析】 C语言时常量分为整型常量、实型常量和字符型常量。用单引号(即撇号 )括起来一个字符称为字符常量,由于字符常量只能包含一个字符,因此选项 A错误;转义字符常量是将反斜杠 ()后面的字符转成另外的意义,选项 D表示了 个 ASCII码为 011的八进制数;选项 B 是用指数形式表示的实型常量。用 “e”或 “E”后的 个整数表示以 10为底的幂数,以这种 形式表示的实型常量需注意字母 e(或 E)之前必须有数字,且 e后面的指数必须为整数;用一对双引号括起来的字符序列称为字符串常量
33、,选项 C就为 个正确的字符串常量。 14 【正确答案】 C 【试题解析】 C语言规定,每个语句和数据定义以分号结束,则说明选项 A是两条语句,前 条是对变量 a作双精度型定义的语句,而后一个 “b;”是一个缺少类型的不正确的定义形式,如果是定义多个变量,则应用逗号隔开;当定义多个变量赋同 个值时,不能用等式连写的方式,如选项 B的 “double a=b=7;”应写成“double a=7,b=7;”所以选项 B 错误,选项 C正确;在定义语句时,类型与变量名之间应用空格分隔,而不是逗号,所以选项 D错误。 15 【正确答案】 D 【试题解析】 本题考查的是算术运算符的优先级。算术运算符包括
34、: +(加法运算符,或正值运算符 )、 -(减法运算符,或负值运算符 )、 *(乘法运算符 )、 /(除法运算符 )、 (模运算符,或称求余运算符 ),其中 *、 /两运算符的优先组相同,所以选项D错误,它表示的是 2abd/c,而不是 2ab/(cd)。 16 【正确答案】 A 【试题解析】 C源程序中的整形常量可 用三种形式表示: 十进制数; 八进制数:以 0开头的数是八进制数; 十六进制数:以 Ox开头的数是十六进制数。 17 【正确答案】 D 【试题解析】 条件表达式的一般形式为:表达式 1?表达式 2:表达式 3,其执行顺序:先求解表达式 1,若非 0(真 )则求解表达式 2,此时表
35、达式 2的值就作为整个条件表达式的值,若表达式 1的值为 0(假 ),则求解表达式 3,此时表达式 3的值就作为整个条件表达式的值。本题中相当于先判断 w 的值是否为非 0,所以与 w等价的表达式是 w!=0。 18 【正确答案】 C 【试题解析】 本 题考查的是括号与逻辑运算符的混合运算,其运算优先级为先括号,后逻辑运算符。另外注意 “”,直接执行下一条语句 “c=a”,故 c变量的值为 10,所以输出结果为 “a=10 b=50 c=10”。 21 【正确答案】 C 【试题解析】 一维数组的定义方式为:类型说明符 数组名 常量表达式 。其中“常量表达式 ”表示元素的个数,即数组长度。元素的
36、下标从 0开始,最大下标是元素个数减一。本题定义了一个由 5个元素 (m0到 m4)组成的数组。选项 A表示对 m3的引用;选项 B 表示对 m4的引用;由于 m0的值为 5,所以选项 C表示 m5,但由于 m数组元素的最大下标为 4,所以本引用下标越界;由于 mi即m4的值为 1,所以选项 D表示对 m1的引用。 22 【正确答案】 A 【试题解析】 本调用语句 func中包含了 3个实参,一个是对 f2函数调用“f2(v1,v2)”的返回值;另一个是逗号表达式 “(v3,v4,v5)”的值 v5(逗号表达式的一般形式为:表达式 1,表达式 2,表达式 3表达式 n,它的值为表达式 n 的值
37、 );还有个实参也是逗号表达式 “v6,max(v7,v8)”的值,即对 max函数调用的返回值。 23 【正确答案】 B 【试题解析】 本题定义了一个有 5个数组元素的 维数组 x和指针变量 p,且将x的首地址 (即 x0)的地址 )赋给了指针变量 p,即 p指向了 x数组的第 0号元素,所以 *p的值为 x0的值,选项 A的引用正确;由于 p+1就是 x1的地址,所以*(p+1)所指向的数组元素为 x1,故选项 C的引用正确;由于 x就是数组 x的首地址,所以 *x即对 x0的引用,所以选项 D引用正确;由于数组最大 下标是元素个数减一,所以选项 B 的引用越界。 24 【正确答案】 A
38、【试题解析】 strlen(字符数组 )是测试字符串的长度的函数。函数的值为字符串的实际长度,不包括 0在内。 C语言中字符串是以 0字符结束的,且 salen()函数计算的是 0字符前的所有字符的个数,所以本题 strlen(s)的值是 7。需要与其区分的是 sizeof()函数,它的功能是计算变量或数组所分配到的内存空间的大小。如果本题要求计算 sizeof(s)的话,则其值应为 10。 25 【正确答案】 B 【试题 解析】 本题考查的是 return语句。用户定义的函数中可以没有 return语句,所以选项 A正确;如果被调函数中没有 return语句,并不带回 个确定的、用户所希望得
39、到的函数值,但实际上,函数并不是不带回值,而只是不带回有用的值,带回的是一个不确定的值,为了明确表示 “不带回值 ”,可以用 “void”定义“无类型 ”,这样,系统就保证不使函数带回任何值,所以选项 C正确;当函数中不需要指明返回值时,可以写成 “return”,所以选项 D正确;一个函数中可以有个以上的 return 语句,执行到哪一个 return语句,哪一 个语句起作用,即返回主函数,不再执行它下面的其他语句,所以选项 B 错误。 26 【正确答案】 C 【试题解析】 宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母,所以选项 A错误;宏命令出现在程序中函数
40、的外面,宏名的有效范围为定义命令之后到本源文件结束,通常,宏命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效,而并不必须位于源程序中所有语句之前,所以选项 B错误;用宏名代替 个字符串,也就是作简单的置换,宏置换不占运行时间,只占编译时间,而日编译时并不分配内存 单元,也不进行值的传递处理。而函数调用则占运行时间 (分配单元、保留现场、值传递、返回 ),所以选项 D错误;宏替换可以代替任何数据类型,不受数据类型的限制,所以选项C正确。 27 【正确答案】 D 【试题解析】 本题考查的是 for循环的嵌套。外层循环变量 i 从 3递减到 1,内层循环变量 j从 1递增到 2,具体
41、运行过程如下: i-3: j=1,满足条件 j =2,输出 i+j=3+1=4; j=2,满足条件 j =2,输出 i+j=3+2=5; j=3,不满足条件 j =2,退出内层循环,执行 “printf(“n“);”语句 ,换行。执行 i-,此时 i=2,满足条件 i=1; i=2: j=1,满足条件 j =2,输出 i+j-2+1=3: j=2,满足条件 j =2,输出i+j=2+2=4; j=3,不满足条件 j =2,退出内层循环,执行 “ptintf(“n“);”语句,换行。执行 i-,此则 i=1,满足条件 i =1; i=1: j=1,满足条件 j =2,输出 i+j=1+1=2;
42、j=2,满足条件 j =2,输出i+j=1+2=3; j=3,不满足条件 j =2,退出内层循环,执行 “printf(“n“);”语句,换行。执行 i-,此时 i=0,不 满足条件 i =1,结束外层循环。 28 【正确答案】 D 【试题解析】 本题考查的是 if语句的嵌套。 C语言规定 else总是与它上面的最近的且不带 else的 if 配对,所以本题 else与 if(y z)配对,即为内嵌 if。在程序执行时,先判断 if(x y)的条件表达式 x y,即 1 2,不成立,所以不执行内嵌 if,直接执行 “printf(“%d“,x+);”语句。由于 x+表示在使用后再将 x加 1,
43、所以输出1。 29 【正确答案】 A 【试题解析】 do-while语句的特点是先执行循环体,然后 判断循环条件是否成立,当循环条件的值为 0时循环结束。 break 的特点;当 break 出现在循环体中,则在执行 break 后,跳出本层循环体。本题执行过程如下: i=5:不满足条件 i 3=1,执行 i+,此叫 i=6; i=6:不满足条件 i 3=1,执行 i+,此时 i=7; i=7:满足条件 i 3=1,执行内嵌 if,判断条件 i 5=2,满足,输出 “*7”,执行break,跳出 do循坏体,执行 “printf(“n“);”,结束。 30 【正确答案】 B 【试题解析】 在调
44、用一个函数的过程中又出现直接或间接 调用该函数本身,称为函数的递归调用。本题考查的是函数递归调用。首先当 a=4,b=2 时,调用fun(4,2),不满足条件 b=0,继续调用 fun函数;此时 a=3,b=1,即调用fun(3,1),不满足条件 b=0,继续调用 fun函数;此时 a=2, b=0,满足条件 b=0,返回 a的值 2。 31 【正确答案】 C 【试题解析】 malloc(sizeof(int)的作用是开辟一个长度为 sizeof(int)存储空间,并通过强制类型转换 (int*)将此存储空间的地址赋给了 个整型的指针变量 p。然后执行语句 “*p=n”,使得 *p 的值为 1
45、0,并通过返回此值,在主函数中输出 a+10的值,即输出 20。 32 【正确答案】 A 【试题解析】 本题中 ci,ci+1的值是实参, a,b 是形参。 C语言规定,实参变量对形参变量的数据传递是 “值传递 ”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。所以函数 run中对 a,b值的交换不影响主函数中 c数组 的值,故输出的 c数组的值为 c数组初始化时的值。 33 【正确答案】 C 【试题解析】 本题定义了一个包含两
46、个元素 (data0、 data1)的结构体数组data,其中 data0.x=1;data0.y=10;data1.x=2; data1.y=20。在主函数中,定义了一个指向结构体数组的结构体指针变量 p,使得 p 指向结构体数组的首地址,所以 p- y访问的是第一个鲒构体数组元素的第二个值,即 data0.y; (+p)- x访问的是第二个结构体数组元素的第一个值,即 data1.x,所以程序输出结果为10,2。 34 【正确答案】 D 【试题解析】 在主函数中,定义了一维数组 k,并通过调用 fun函数将形参数组a指向实参数组 k所在的存储单元,这样, a和 k共用同一存储单元,所以对数组 a的元素值的改变相当于对相应数组 k的元素值的改变。在 fun函数中,通过for循环对数组元素 a0与 a4、 a1与 a3的值分别作了交换,也即相当于主函数中 k0与 k4、 k1与 k3的值分别作了交换,此时 k中各