1、国家二级 C 语言(选择结构、循环结构)机试模拟试卷 1 及答案解析(总分:66.00,做题时间:90 分钟)一、选择题(总题数:33,分数:66.00)1.下列选项中,当 x 为大于 1 的奇数时,值为 0 的表达式是( )。(分数:2.00)A.x2=0B.x2C.x2!=0D.x2=12.若 a 是数值类型,则逻辑表达式(a=1)(a!=1)的值是( )。(分数:2.00)A.1B.0C.2D.不知道 a 的值,不能确定3.当变量 e 的值不为 2、4、6 时,值为“真”的表达式是( )。(分数:2.00)A.(c=2&e=2&c=2&c6)(c!=3)lI(c!=5)4.有以下程序:
2、#include main() int a=1,b=2,c=3,d=0; if(a=1&b+=2) if(b!=2c 一!=3) prinff(“d,d,dn”,a,b,c); else prinff(“d,d,dn”,a,b,c); else prinff(“d,d,dn”,a,b,c); 程序的运行结果是( )。(分数:2.00)A.1,3,2B.1,3,3C.1,2,3D.3,215.下列关于逻辑运算符两侧运算对象的叙述中正确的是( )。(分数:2.00)A.可以是任意合法的表达式B.只能是整数 0 或非 0 整数C.可以是结构体类型的数据D.只能是整数 0 或 16.设有宏定义:#de
3、fine IsDIV(k,n)(kn=1)?1:0),且变量 m 已正确定义并赋值,则宏调用:IsDIV(m,5)&IsDIV(m,7)为真时所要表达的是( )。(分数:2.00)A.判断 m 是否能被 5 和 7 整除B.判断 m 被 5 和 7 整除是否都余 1C.判断 m 被 5 或者 7 整除是否余 1D.判断 m 是否能被 5 或者 7 整除7.if 语句的基本形式是:if(表达式)语句,以下关于“表达式”值的叙述中正确的是( )。(分数:2.00)A.必须是逻辑值B.必须是整数值C.必须是正数D.可以是任意合法的数值8.下列条件语句中,输出结果与其他语句不同的是( )。(分数:2.
4、00)A.if(a!=0)printf(“dn”,x);else prinff(“dn”,y);R)if f a=0)prinff(“dn”,y);else printf(“dn”,x);B.if(a=0)printf(“dn”,x);else printf(“dn”,y);C.if(D.printf(“dn”,x);else printf(“dn”,y);9.有以下程序: #include main() int a=0,b=0,c=0,d=0; if(a=1)b=1;c=2; else d=3; printf(“d,d,d,dn”,a,b,c,d); 程序的运行结果是( )。(分数:2.00
5、)A.1,1,2,0B.0,0,0,3C.编译有错D.0,1,2,010.设有定义:int a=1,b=2,c=3;以下语句中执行效果与其他 3 个不同的是( )。(分数:2.00)A.if(ab)a,a=b,b=e;B.if(ab):a,a:b,b=C;C.if(ab)a;a=b;b=c;D.if(ab)e:a;a:b;b=c;11.有以下程序: #include main() int x=1,y=0; if(!x)y+; else if(x=0) if(x)y+=2; else y+=3; printf(“dn”,Y); 程序运行后的输出结果是( )。(分数:2.00)A.3B.2C.1D
6、.012.有嵌套的 if 语句: if(aA.k=(ay)if(yA.1B.41C.2D.33114.以下程序段中与语句 k=ab?(be?1:0):0;功能相同的是( )。(分数:2.00)A.if(ab)(bc)k=1; else k=0:B.if(ab)&(bc)k=1; else k=0;C.if(ab)k=1; else if(bc)k=1; else k=0;15.有以下程序: main() int x=1,y=0,a=0,b=0; switch(x) ease 1: switch(y) printf(“a=d,b=dn”,a,b); 程序的运行结果是( )。(分数:2.00)A.
7、a=2,b=2B.a=2,b=1C.a=1,b:1D.a=1,b=016.若有定义:float x=15;int a=1,b=3,c=2;,则正确的 switch 语句是( )。(分数:2.00)A.switch(a+b) case 1:prinff(“*n”); case 2+1:printf(“*n”);B.switch(int)x); case 1:prinff(“*n”); case 2:prinff(“*n”);C.switch(x) case 10:printf(“*n”); case 20:printf(“*n”);D.switch(a+b) case 1:prinff(“*n”
8、); case c:prinff(“*n”);17.下列叙述中正确的是( )。(分数:2.00)A.在 switch 语句中不一定使用 break 语句B.在 switch 语句中必须使用 default 语句C.break 语句必须与 switch 语句中的 ease 配对使用D.break 语句只能用于 switch 语句18.下列选项中与 if(a=1)a=b;else a+;语句功能不同的 switch 语句是( )。(分数:2.00)A.switch(a=1) ease 0:a=b;break: case 1:a+; B.switch(a) case 1:a=b;break: def
9、ault:a+: C.switch(a) default:a+;break; case 1:a=b: D.switch(a=1) case 1:a=b;break; case 0:a+: 19.有以下程序: #include main() int y=10: while(y 一一); printf(“y=dn”,Y); 程序执行后的输出结果是( )。(分数:2.00)A.y=0B.y=一 1C.y=1D.while 构成无限循环20.有以下程序: #include main() int k=5; while(一 k) printf(“d”,k 一=3); printf(“n”); 执行后的输出
10、结果是( )。(分数:2.00)A.1B.2C.4D.死循环21.有以下函数: int fun(char*s) char*t=s: while(*t+); reHm(ts); 该函数的功能足( )。(分数:2.00)A.计算 s 所指字符串的长度B.比较两个字符串的大小C.计算 s 所指字符串占用内存字节的个数D.将 s 所指字符串复制到字符串 t 中22.有以下函数: int aaa(char*s) char*t=s: while(*t+); t 一一: return(ts); 以下关于aalt 函数功能叙述正确的是( )。(分数:2.00)A.将串 s 复制到串 tB.比较两个串的大小C.
11、求字符串 s 的长度D.求字符串 s 所占字节数23.在以下给出的表达式中,与 while(E)中的(E)不等价的表达式是( )。(分数:2.00)A.(E0F0;y 一一) if(y3=0) prinff(“d”,一 y); 程序的运行结果是( )。(分数:2.00)A.852B.963C.741D.87542128.有以下程序: #include main() int a=1,b=2; for(;aA.9,18B.8,11C.7,11D.10,1429.有以下程序: #include main() int x=8; for(;x0;x 一一) if(x3) printf(“d,”,x 一一
12、); continue; printf(“d,”,一 x); 程序的运行结果是( )。(分数:2.00)A.7,4,2,B.8,7,5,2,C.9,7,6,4,D.8,5,4,2,30.有以下程序: #include main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=1; for(i=0;i=2&e=2&c=2&c6)(c!=3)lI(c!=5) 解析:解析:逻辑或运算符中只要有一个运算量为真,结果就是真,当 c=2&cb)a,a=b,b=e;B.if(ab):a,a:b,b=C;C.if(ab)a;a=b;b=c; D.if(ab)e:a;a:b;b=c;解析:解
13、析:由于 a 不小于 b,所以所有选项中的条件都为假,A 选项中实际执行了 a=b;b=c;两个操作。而 B、C、D 选项由于条件不成立,所以什么也没有做,所以选择 C 选项。11.有以下程序: #include main() int x=1,y=0; if(!x)y+; else if(x=0) if(x)y+=2; else y+=3; printf(“dn”,Y); 程序运行后的输出结果是( )。(分数:2.00)A.3B.2C.1D.0 解析:解析:在 jf else 语句中,else 总是与离它最近的 if 配对。本题中 x 为 1,所以!x 为 0,所以执行 else if 语句中
14、的内容,判断(x=0)是否成立,因为 x 为 1,所以条件不成立,所以 else if 内部的ifelse 语句不再执行,y 的值还是初始值 0。12.有嵌套的 if 语句: if(aA.k=(ay)if(yA.1 B.41C.2D.331解析:解析:else 总是与离它最近的 if 配对,所以第一个 if 语句的判断条件不成立,不再执行第二个if 语句和与第二个 if 语句配对的 else 语句,而是直接执行打印 x+的操作,打印 x 的值 1 以后再加 1。14.以下程序段中与语句 k=ab?(be?1:0):0;功能相同的是( )。(分数:2.00)A.if(ab)(bc)k=1; el
15、se k=0:B.if(ab)&(bc)k=1; else k=0; C.if(ab)k=1; else if(bc)k=1; else k=0;解析:解析:条件表达式的含义是,如果表达式 1 成立,结果为表达式 2 的值,如果不成立,则为表达式3 的值。所以题干中 k 的值这样取值:如果 ab 且 bc,k 值结果为 1,如果 ab 且 bc 中只要有一个条件不成立,k 的值就为 0,所以选择 B 选项。15.有以下程序: main() int x=1,y=0,a=0,b=0; switch(x) ease 1: switch(y) printf(“a=d,b=dn”,a,b); 程序的运行
16、结果是( )。(分数:2.00)A.a=2,b=2B.a=2,b=1 C.a=1,b:1D.a=1,b=0解析:解析:case 常量表达式只是起语句标号作用,并不使该处进行条件判断。在执行 switch 语句时,根据 switch 的表达式,找到与之匹配的 case 语句,就从此 case 子句执行下去,不再进行判断,直到碰到 break 或函数结束为止。所以执行内层 switch(y)时只执行了 a+,此时 a 的值为 1,然后执行外层case 2 语句的 a+;b+;,a 为 2,b 为 1,所以结果为 B 选项。16.若有定义:float x=15;int a=1,b=3,c=2;,则正
17、确的 switch 语句是( )。(分数:2.00)A.switch(a+b) case 1:prinff(“*n”); case 2+1:printf(“*n”); B.switch(int)x); case 1:prinff(“*n”); case 2:prinff(“*n”);C.switch(x) case 10:printf(“*n”); case 20:printf(“*n”);D.switch(a+b) case 1:prinff(“*n”); case c:prinff(“*n”);解析:解析:B 选项中 switch(int)x);语句中不应该有最后的分号。switch(ex
18、pr1)中的 expr1 不能用浮点类型或 long 类型,也不能为一个字符串,所以 C 选项错误。case 后面常量表达式的类型必须与switch 后面表达式的类型一致,所以 D 选项错误。17.下列叙述中正确的是( )。(分数:2.00)A.在 switch 语句中不一定使用 break 语句 B.在 switch 语句中必须使用 default 语句C.break 语句必须与 switch 语句中的 ease 配对使用D.break 语句只能用于 switch 语句解析:解析:defauh 语句在 switch 语句中可以省略,所以 B 选项错误;switch 语句中并非每个 case
19、后都需要使用 break 语句,所以 C 选项错误;break 语句还可以用于 for 等循环结构中,所以 D 选项错误。18.下列选项中与 if(a=1)a=b;else a+;语句功能不同的 switch 语句是( )。(分数:2.00)A.switch(a=1) ease 0:a=b;break: case 1:a+; B.switch(a) case 1:a=b;break: default:a+: C.switch(a) default:a+;break; case 1:a=b: D.switch(a=1) case 1:a=b;break; case 0:a+: 解析:解析:if
20、语句的含义是:如果 a 的值为 1,将 b 的值赋给 a,否则将 a 的值自增 1。是switch(a=1)中表达式 a=1 的结果如果为真,即为 1,则从 easel 开始执行,直到遇到 break 语句跳出switch 语句,如果 a=1 的结果为假,即 0,则从 case0 开始执行,所以与题干含义执行操作相反的是选项 A 中的语句。19.有以下程序: #include main() int y=10: while(y 一一); printf(“y=dn”,Y); 程序执行后的输出结果是( )。(分数:2.00)A.y=0B.y=一 1 C.y=1D.while 构成无限循环解析:解析:
21、执行 y 一直到值为 0,由于 y 一是先用再减,所以退出循环时,y 的值为一 1。20.有以下程序: #include main() int k=5; while(一 k) printf(“d”,k 一=3); printf(“n”); 执行后的输出结果是( )。(分数:2.00)A.1 B.2C.4D.死循环解析:解析:一 k 先自减再使用,所以第一次判断条件即为 while(4),条件为真执行打印 k 的值 k=43,结果为 1,第二次判断条件即为 while(0),条件为假,结束循环,打印回车换行符,所以选择 A 选项。21.有以下函数: int fun(char*s) char*t=
22、s: while(*t+); reHm(ts); 该函数的功能足( )。(分数:2.00)A.计算 s 所指字符串的长度 B.比较两个字符串的大小C.计算 s 所指字符串占用内存字节的个数D.将 s 所指字符串复制到字符串 t 中解析:解析:首先 char*s 接受一个字符型数组的首地址,并将这个首地址赋给另一个字符型指针char*t,while(*t+)不断循环直到*t 为0,再将 t 一 1,这时字符指针 t 指向字符串的最后一个字符,又因为 s 指向字符数组的首地址,即字符串的首地址,所以 return(ts)便是返回字符数组中字符串的长度。22.有以下函数: int aaa(char*
23、s) char*t=s: while(*t+); t 一一: return(ts); 以下关于aalt 函数功能叙述正确的是( )。(分数:2.00)A.将串 s 复制到串 tB.比较两个串的大小C.求字符串 s 的长度 D.求字符串 s 所占字节数解析:解析:本题重点考查的知识点是 while 循环语句的应用。aaa()函数中,首先定义了一个字符指针 t 指向形参 s,然后通过一个 while 循环让指针 t 不断递增,直到 t 指向字符串结束标识处。当 t 指向结束标识处时,由了后缀+运算符的原因,它还会被再递增 1,所以接下来的 t 一语句让它回到束标识处。最后返回 ts,s 还是指向字
24、符串第一个字符处,而 t 指向了字符串结尾,故返回值为字符串的长度值,因此 C 选项正确。23.在以下给出的表达式中,与 while(E)中的(E)不等价的表达式是( )。(分数:2.00)A.(E0F0;y 一一) if(y3=0) prinff(“d”,一 y); 程序的运行结果是( )。(分数:2.00)A.852 B.963C.741D.875421解析:解析:第 1 次 for 循环,y 的值为 9,y3 的值为 0,满足条件打印一 y,即先减一后打印,所以打印 8;第 2 次 for 循环,y 的值为 7,y3 的值为 1,不执行打印语句;第 3 次 for 循环,y 的值为6,y
25、3 的值为 0,满足条件打印一 y,即先减一后打印,所以打印 5;第 4 次 for 循环,y 的值为 4,不满足 if 条件,不执行打印语句;第 5 次 for 循环,y 的值为 3,满足 if 条件,打印输出 2;第 6 次 for循环,y 的值为 1,不满足条件,不执行打印语句。28.有以下程序: #include main() int a=1,b=2; for(;aA.9,18B.8,11C.7,11D.10,14 解析:解析:第 1 次循环,a 的值为 1,满足条件,执行 b+=a,与 a+=2,则 b 的值变为 3,a 的值变为3。执行 a+,a 的值为 4,满足条件进入第 2 次
26、循环,执行完循环体后,b 的值为 7,a 的值为 6。执行a+,a 的值为 7,满足条件进入第 3 次循环,执行完循环体后,b 的值为 14,a 的值为 9。执行 a+,a 的值变为 10,所以选择 D 选项。29.有以下程序: #include main() int x=8; for(;x0;x 一一) if(x3) printf(“d,”,x 一一); continue; printf(“d,”,一 x); 程序的运行结果是( )。(分数:2.00)A.7,4,2,B.8,7,5,2,C.9,7,6,4,D.8,5,4,2, 解析:解析:coutinue 语句的作用是跳出循环体中剩余的语句
27、而进行下一次循环。第 1 次循环,x 的值为8,循环体中 if 条件成立,打印 x 的值 8 后将 x 减 1,再执行 continue 语句,跳出本次循环。第 2 次判断循环条件时,x 的值变为 6,不满足循环体内 if 条件,执行打印一 x 的操作,即打印 5 后跳出循环。第3 次判断循环条件时 x 的值为 4,满足循环体内 if 条件,执行打印 x 一的操作,即打印 4,后将 x 值减一,执行 continue 语句,跳出本次循环。第 4 次判断循环条件时 x 的值为 2,满足循环体内 if 条件,打印 x一,即打印 2,后将 x 减 1,执行 continue 语句,跳出本次循环。在进
28、行 for 条件表达式中第 3 个表达式x 一的操作后,x 的值为 0,不满足条件,结束循环。所以打印结果为 8,5,4,2,。30.有以下程序: #include main() int b33=0,1,2,0,1,2,0,1,2,i,j,t=1; for(i=0;i=i;j+)t+=bibji/; printf(“dn”,t); 程序的运行结果是( )。(分数:2.00)A.3B.4 C.1D.9解析:解析:每次内循环只循环一次就结束,第 1 次外循环时,t=t+b0b00/=1+b00=1+0=1;第 2 次外循环时,t=t+b1b11/=1+b11=1+1=2;第 3 次外循环时,t=t
29、+b2b22/=2+b22=2+2=4。31.有以下程序: #include main() int i; for(i=1;i=40;i+) if(i+5=0) if(+i8=0) prinff(“d”,i); prinff(“n”); 程序的运行结果是( )。(分数:2.00)A.5B.24C.32 D.40解析:解析:本题的含义是在 140 的整数范围中,只有当 i 的值能被 5 整除,且 i+2 的值能被 8 整除时,打印 i 的值,满足这个条件的只有 32,所以选择 C 选项。32.有以下程序: #include main() int i,j,m=55; for(i=1;i=3;i+)
30、for(j=3;j=i;j+) m=mj: printf(“dn”,m); 程序的运行结果是( )。(分数:2.00)A.0B.1 C.2D.3解析:解析:第 1 次执行外循环 i 的值为 1,满足条件,判断第 1 次内循环,j 的值为 3,不满足条件,跳出内循环。第 2 次执行外循环 i 的值为 2,同理也不满足内循环条件,跳出内循环。第 3 次执行外循环i 的值为 3,此时进入内循环判断条件时,条件成立,执行 m=mj,m 的值为 l,跳出内循环,跳出外循环,打印 m 的值。33.下列叙述中正确的是( )。(分数:2.00)A.continue 语句的作用是使程序的执行流程跳出包含它的所有循环B.break 语句只能用在循环体内和 switch 语句体内 C.在循环体内使用 break 语句和 continue 语句的作用相同D.break 语句只能用于 switch 语句体中解析:解析:continue 语句的作用是跳过循环体中剩余的语句而进行下一次循环,所以 A 选项错误。break 语句的作用是终止正在执行的 switch 流程,跳出 switch 结构或者强制终止当前循环,从当前执行的循环中跳出,所以 C、D 选项错误。