1、国家二级 C 语言(运算符与表达式、基本语句)机试模拟试卷 2 及答案解析(总分:60.00,做题时间:90 分钟)一、选择题(总题数:30,分数:60.00)1.表达式(int)(double)92)-92 的值是( )。(分数:2.00)A.0B.3C.4D.52.若有定义 int x,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x+):(y+)中的条件表达式(x-y)等价的是( )。(分数:2.00)A.(x-y0|x-y0)B.(x-y0)C.(x-y0)D.(x-y=0)3.若变量已正确定义,在 if(W)printf(“dn“,k);中,以下不可替代 W 的是( )。
2、(分数:2.00)A.ab+cB.ch=getchar()C.a=b+cD.a+4.若有定义语句:int x=10;,则表达式 x-=x+x 的值为( )。(分数:2.00)A.0B.-20C.-10D.105.设有定义:int x=2;,以下表达式中,值不为 6 的是( )。(分数:2.00)A.2*x,x+=2B.x+,2*xC.x*=(1+x)D.x*=x+16.若有定义语句:int x=12,y=8,z;,在其后执行语句 z=09+xy;,则 z 的值为( )。(分数:2.00)A.1B.19C.2D.247.表达式 36-52+12+52 的值是( )。(分数:2.00)A.43B.
3、48C.33D.388.有定义语句:int a;long b;double x,y;,则以下选项中正确的表达式是( )。(分数:2.00)A.a=xyB.a(int)(x-y)C.(a*y)bD.y=x+y=x9.设变量已正确定义并赋值,下列表达式中正确的是( )。(分数:2.00)A.x=y+z+5,+yB.iut(1585)C.x=y*5=x+zD.x=255010.以下不能将 s 所指字符串正确复制到 t 所指存储空间的是( )。(分数:2.00)A.do*t+=*s+;while(*s);B.for(i=0;ti=si;i+);C.while(*t=*s)t+;s+;D.for(i=0
4、,j=0;ti+=sj+;);11.设有定义:int k=0;,以下选项的 4 个表达式中与其他 3 个表达式的值不相同的是( )。(分数:2.00)A.+kB.k+=1C.k+D.k+112.若有定义语句:int year=2009,*p=&year;,以下不能使变量 year 中的值增至 2010 的语句是( )。(分数:2.00)A.(*p)+;B.*p+;C.+(*p);D.*p+=1;13.若有定义:double a=22;int i=0,k=18;,则不符合 C 语言规定的赋值语句是( )。(分数:2.00)A.i=(a+k)=(i+k);B.i=a!1;C.a=a+,i+;D.i
5、=!a;14.若变量 x、y 已正确定义并赋值,以下符合 C 语言语法的表达式是( )。(分数:2.00)A.x+1=yB.+x,y=x-C.x=x+10=x+yD.double(x)1015.若变量均已正确定义并赋值,以下合法的 C 语言赋值语句是( )。(分数:2.00)A.x:y=5;B.x=n25;C.x+n=i;D.x=5=4+1;16.表达式 a+=a-=a=9 的值是( )。(分数:2.00)A.18B.-9C.0D.917.设有以下语句:int a=1,b=2,c;c=a(b2);执行后,c 的值为( )。(分数:2.00)A.7B.9C.8D.618.若有以下程序段:int
6、r=8;printf(“dn“,r1);输出结果是( )。(分数:2.00)A.16B.8C.4D.219.有以下程序:#includestdiohmain()int a=1,b=2,c=3,x;x=(ab)&c;printf(“dn“,x);程序的运行结果是( )。(分数:2.00)A.3B.1C.2D.020.若变量已正确定义,则语句 s=32;s=32;printf(“d“,s);的输出结果是( )。(分数:2.00)A.-1B.0C.1D.3221.以下叙述中错误的是( )。(分数:2.00)A.gets 函数用于从终端读入字符串B.getehar 函数用于从磁盘文件读入字符C.fpu
7、ts 函数用于把字符串输出到文件D.fwrite 函数用于以二进制形式输出数据到文件22.要求通过 while 循环不断读入字符,当读入字母 N 时结束循环。若变量已正确定义,以下正确的程序段是( )。(分数:2.00)A.while(ch=getchar()=N)printf(“c“,ch);B.while(ch=getchar()!=N)printf(“c“,ch);C.while(ch=getchar()=N)printf(“c“,ch);D.while(ch=getchar()=N)printf(“c“,ch);23.以下不能输出字符 A 的语句是(注:字符 A 的 ASCII 码值为
8、 65,字符 a 的 ASCII 码值为 97)( )。(分数:2.00)A.printf(“cn“,a-32);B.printf(“dn“,A);C.printf(“13n“,65);D.printf(“cn“,B-1);24.已知字符 A 的 ASCII 码值是 65,字符变量 c1 的值是A,c2 的值是D,则执行语句printf(“d,d“,c1,c2-2);的输出结果是( )。(分数:2.00)A.65,68B.A,68C.A,BD.65,6625.有如下程序段:int x=12;double y=3141593;printf(“d86f“,x,y);其输出结果是( )。(分数:2.
9、00)A.123141593B.123141593C.12,3141593D.123141593026.若变量已正确定义为 int 型,要通过语句 seanf(“d,d,d“,&a,&b,&C);给 a 赋值 1、给 b赋值 2、给 c 赋值 3,以下输入形式中错误的是(注:代表一个空格符)( )。(分数:2.00)A.1,2,3回车B.1,2,3回车C.1,2,3回车D.123回车27.若有定义:int a,b;,通过语句 scanf(”d;d”,&a,&b);能把整数 3 赋给变量 a、5 赋给变量 b 的输入数据是( )。(分数:2.00)A.3 5B.3,5C.3;5D.3528.若有
10、定义语句:int a,b,c,*p=&c;,接着执行以下选项中的语句,则能正确执行的语句是( )。(分数:2.00)A.seanf(“d“,a,b,12);B.scanf(“ddd“,a,b,c);C.seanf(“d“,p);D.scanf(“d“,&p);29.设有定义:int a;float b;,执行 seanf(“2df“,&a,&b);语句时,若从键盘输入8765430回车,则 a 和 b 的值分别是( )。(分数:2.00)A.87 和 60B.876 和 5430C.87 和 5430D.76 和 543030.有以下程序段:#includestdiohint j;float
11、y;char name50;seanf(“2dfs“,&j,&y,name);当执行上述程序段时,从键盘上输入 555667777abc 后,y 的值为( )。(分数:2.00)A.5660B.555660C.77770D.5667770国家二级 C 语言(运算符与表达式、基本语句)机试模拟试卷 2 答案解析(总分:60.00,做题时间:90 分钟)一、选择题(总题数:30,分数:60.00)1.表达式(int)(double)92)-92 的值是( )。(分数:2.00)A.0B.3 C.4D.5解析:解析:先将整型数据 9 强制转换成 double 型,然后除以 2,得到的结果与 doub
12、le 型保持一致,即为 45,然后将 45 强制转换成整型数据 4,然后计算 92 的值为 1,最后计算 4-1 的值为 3,所以选择 B 选项。2.若有定义 int x,y;并已正确给变量赋值,则以下选项中与表达式(x-y)?(x+):(y+)中的条件表达式(x-y)等价的是( )。(分数:2.00)A.(x-y0|x-y0) B.(x-y0)C.(x-y0)D.(x-y=0)解析:解析:条件表达式“x=表达式 17 表达式 2:表达式 3”的含义是:先求解表达式 1,若为非 0(真),则求解表达式 2,将表达式 2 的值赋给 x;若表达式 1 的值为 0(假),则求解表达式 3,将表达式
13、3 的值赋给 x。本题中与条件表达式:(x-y)等价的是(x-y0|x-y0)。3.若变量已正确定义,在 if(W)printf(“dn“,k);中,以下不可替代 W 的是( )。(分数:2.00)A.ab+c B.ch=getchar()C.a=b+cD.a+解析:解析:选项 A 是非法的表达式,C 语言中没有“”运算符。4.若有定义语句:int x=10;,则表达式 x-=x+x 的值为( )。(分数:2.00)A.0B.-20C.-10 D.10解析:解析:算术运算符+的优先级高于-=,且-=的结合方向为自右向左,所以表达式 x-=x+x 可以表示成x=x-(x+x)=10-(10+10
14、)=-10,选择 C 选项。5.设有定义:int x=2;,以下表达式中,值不为 6 的是( )。(分数:2.00)A.2*x,x+=2 B.x+,2*xC.x*=(1+x)D.x*=x+1解析:解析:A 选项中逗号表达式先计算第一表达式 2*x,然后计算表达式 x+=2 的值,即 x=x+2 即 4,整个逗号表达式为第二个表达式的值 4,所以选择 A 选项。B 选项中首先计算逗号表达式中第一表达式x+,此时 x 为 3,再执行第二个表达式 2*x=2*3=6,所以逗号表达式为第二个表达式的值 6。C 选项的赋值表达式可以表示为 x=x*(1+x)=2*(1+2)=6。D 选项中的表达式可以表
15、示为 x=x*(x+1)=2*3=6。6.若有定义语句:int x=12,y=8,z;,在其后执行语句 z=09+xy;,则 z 的值为( )。(分数:2.00)A.1 B.19C.2D.24解析:解析:先计算 xy,结果为 1,然后计算 09+1,结果为 19,但由于变量 z 为整型,取值 1,所以 z 的值为 1。7.表达式 36-52+12+52 的值是( )。(分数:2.00)A.43B.48C.33D.38 解析:解析:计算 52,结果取整数值 2。计算 36-2,结果与高精度数据保持一致,即为 16。计算16+12,结果为 28。计算 52,结果为 1。计算 28+1 结果为 38
16、。所以选择 D 选项。8.有定义语句:int a;long b;double x,y;,则以下选项中正确的表达式是( )。(分数:2.00)A.a=xyB.a(int)(x-y) C.(a*y)bD.y=x+y=x解析:解析:C 语言中没有“”运算符,所以 A 选项错误。“”运算符的两个操作值必须为整型数据,所以 B 选项正确。a*y 的结果为 double 型,所以 C 选项错误。不能将值赋给像 x+y 这样的表达式,所以 D 选项错误。9.设变量已正确定义并赋值,下列表达式中正确的是( )。(分数:2.00)A.x=y+z+5,+y B.iut(1585)C.x=y*5=x+zD.x=25
17、50解析:解析:B 选项与 D 选项中取模运算符的左右两个操作数均应为整数,所以错误。C 选项中不能将x+y 的值赋给表达式 y*5,所以 C 选项错误。10.以下不能将 s 所指字符串正确复制到 t 所指存储空间的是( )。(分数:2.00)A.do*t+=*s+;while(*s); B.for(i=0;ti=si;i+);C.while(*t=*s)t+;s+;D.for(i=0,j=0;ti+=sj+;);解析:解析:“do*t+=*s+;while(*s);”不能因为当术 s=0时,while(*s)跳出循环,这样字符串结束标志0没有复制给*t,造成*t 不完整。注意,*t+=*s+
18、是先执行*t=*s,然后才进行*t=t+1,s=s+1。B、C、D 选项都能将0复制过去。11.设有定义:int k=0;,以下选项的 4 个表达式中与其他 3 个表达式的值不相同的是( )。(分数:2.00)A.+kB.k+=1C.k+ D.k+1解析:解析:+k,先使得 k 的值自增 1 后再使用,k+是先取得 k 的值再将 k 的值自增 1,所以 C 选项中表达式的值为 0,而其他 3 个表达式的值均为 1,所以选择 C 选项。12.若有定义语句:int year=2009,*p=&year;,以下不能使变量 year 中的值增至 2010 的语句是( )。(分数:2.00)A.(*p)
19、+;B.*p+; C.+(*p);D.*p+=1;解析:解析:由于自加运算符+的运算级别高于间接运算*的运算级别,所以 B 选项的表达式*p+不能使变量 year 中的值增至 2010,因此选择 B 选项。13.若有定义:double a=22;int i=0,k=18;,则不符合 C 语言规定的赋值语句是( )。(分数:2.00)A.i=(a+k)=(i+k);B.i=a!1; C.a=a+,i+;D.i=!a;解析:解析:取模运算符“”、二元运算符具有左结合性,参与运算的量均为整型。B 选项中的 a 变量是 double 实型,不符合规定。14.若变量 x、y 已正确定义并赋值,以下符合
20、C 语言语法的表达式是( )。(分数:2.00)A.x+1=yB.+x,y=x- C.x=x+10=x+yD.double(x)10解析:解析:不能将变量赋给表达式,故 A、C 选项错误,D 选项中强制类型转换表达式应写成(double)x10。15.若变量均已正确定义并赋值,以下合法的 C 语言赋值语句是( )。(分数:2.00)A.x:y=5; B.x=n25;C.x+n=i;D.x=5=4+1;解析:解析:B 选项中运算符“”的前后必须为整数,C 选项中不能将变量赋给表达式 x+n,D 选项中不能将表达式 4+1 赋给常量 5。16.表达式 a+=a-=a=9 的值是( )。(分数:2.
21、00)A.18B.-9C.0 D.9解析:解析:首先计算 a=9,然后计算 a-=9,即 a=a-9,结果为 0,然后计算 a+=0,即 a=a+0,所以最终结果为 0。17.设有以下语句:int a=1,b=2,c;c=a(b2);执行后,c 的值为( )。(分数:2.00)A.7B.9 C.8D.6解析:解析:b 为 2,二进制为 00000010,执行左移两位操作后为 00001000,然后与 a(00000001)做异或运算的结果为 00001001,即十进制的 9。18.若有以下程序段:int r=8;printf(“dn“,r1);输出结果是( )。(分数:2.00)A.16B.8
22、C.4 D.2解析:解析:本题考查位运算,属于基础知识。题目中的整型变量 8,二进制表达为 00001000,右移一位为 00000100,即 4,C 选项正确。19.有以下程序:#includestdiohmain()int a=1,b=2,c=3,x;x=(ab)&c;printf(“dn“,x);程序的运行结果是( )。(分数:2.00)A.3 B.1C.2D.0解析:解析:本题考查位运算符以及相关运算。为按位或,&为按位与,那么 ab 为 3,再与 c 按位与仍然为 3,所以答案为 A 选项。20.若变量已正确定义,则语句 s=32;s=32;printf(“d“,s);的输出结果是(
23、 )。(分数:2.00)A.-1B.0 C.1D.32解析:解析:本题考查逻辑异或运算。异或运算只有在两个比较的位不同时其结果为 1,否则结果为 0,题目中两个值相同,所以结果为 0。21.以下叙述中错误的是( )。(分数:2.00)A.gets 函数用于从终端读入字符串B.getehar 函数用于从磁盘文件读入字符 C.fputs 函数用于把字符串输出到文件D.fwrite 函数用于以二进制形式输出数据到文件解析:解析:本题考查字符处理函数和文件读写函数,属于基础知识。其中 B 选项的 getchar 函数用于从终端读入字符。22.要求通过 while 循环不断读入字符,当读入字母 N 时结
24、束循环。若变量已正确定义,以下正确的程序段是( )。(分数:2.00)A.while(ch=getchar()=N)printf(“c“,ch);B.while(ch=getchar()!=N)printf(“c“,ch); C.while(ch=getchar()=N)printf(“c“,ch);D.while(ch=getchar()=N)printf(“c“,ch);解析:解析:在 C 语言中,等于号用“=”表示,一个“=”表示赋值,当读入字母 N 时,选项 A 中,while 后的条件值为“N”,是非零数,条件成立,循环继续执行,所以 A 选项错误。C、D 选项的含义都是如果输入的字
25、符为“N”,则打印输出,所以正好和题意相反。23.以下不能输出字符 A 的语句是(注:字符 A 的 ASCII 码值为 65,字符 a 的 ASCII 码值为 97)( )。(分数:2.00)A.printf(“cn“,a-32);B.printf(“dn“,A); C.printf(“13n“,65);D.printf(“cn“,B-1);解析:解析:B 选项输出的格式为d,即为整型格式,所以输出字符 A 的 ASCII 码值 65,而不是字符A。由于大写字母比和其对应的小写字母的 ASCII 码值小 32,所以 A 选项正确。字符 A 的 ASCII 码值就是65,所以以c 格式输出可以输
26、出字符 A,所以 C 选项正确。由于字符 A 的 ASCII 码值比字符 B 的小 1,所以 D 选项正确。24.已知字符 A 的 ASCII 码值是 65,字符变量 c1 的值是A,c2 的值是D,则执行语句printf(“d,d“,c1,c2-2);的输出结果是( )。(分数:2.00)A.65,68B.A,68C.A,BD.65,66 解析:解析:打印时以d 整型格式打印输出,所以字符变量 cl 的值打印出来就是 65,从 c2-2 的值打印出来就是 68-2,即 66,所以选择 D 选项。25.有如下程序段:int x=12;double y=3141593;printf(“d86f“
27、,x,y);其输出结果是( )。(分数:2.00)A.123141593 B.123141593C.12,3141593D.1231415930解析:解析:printf 函数中格式字符“86”的含义是:变量 y 的输出宽度为 8(包括小数点),小数点后面保留 6 位小数,且右对齐,当数值的实际宽度大于设定宽度时,按实际宽度输出,所以选择 A 选项。26.若变量已正确定义为 int 型,要通过语句 seanf(“d,d,d“,&a,&b,&C);给 a 赋值 1、给 b赋值 2、给 c 赋值 3,以下输入形式中错误的是(注:代表一个空格符)( )。(分数:2.00)A.1,2,3回车B.1,2,
28、3回车C.1,2,3回车D.123回车 解析:解析:在输入整数或实数这类数值型数据时,输入数据之间必须用空格、回车符、制表符等间隔符隔开,间隔符个数不限。scanf()的格式控制串也可以使用其他非空白字符,如本题中的逗号,但在输入时必须输入这些字符,以保证匹配,所以逗号必须输入。27.若有定义:int a,b;,通过语句 scanf(”d;d”,&a,&b);能把整数 3 赋给变量 a、5 赋给变量 b 的输入数据是( )。(分数:2.00)A.3 5B.3,5C.3;5 D.35解析:解析:输入数据的格式必须与 scanf()的格式控制串完全匹配,所以输入时必须在 3 和 5 之间输入“;”
29、。28.若有定义语句:int a,b,c,*p=&c;,接着执行以下选项中的语句,则能正确执行的语句是( )。(分数:2.00)A.seanf(“d“,a,b,12);B.scanf(“ddd“,a,b,c);C.seanf(“d“,p); D.scanf(“d“,&p);解析:解析:本题重点考查的知识点是标准输入函数 scanf()。scanf()函数要求,除了第一个参数为格式化字符串以外,其余参数均为相应变量的地址值。本题中,只有 p 是地址值,因此 C 选项正确。29.设有定义:int a;float b;,执行 seanf(“2df“,&a,&b);语句时,若从键盘输入8765430回
30、车,则 a 和 b 的值分别是( )。(分数:2.00)A.87 和 60 B.876 和 5430C.87 和 5430D.76 和 5430解析:解析:在格式字符前加入一个整数可以指定输入数据所占的宽度,所以赋值时会将 87 赋给变量a,把 60 赋给 float 型变量 b。30.有以下程序段:#includestdiohint j;float y;char name50;seanf(“2dfs“,&j,&y,name);当执行上述程序段时,从键盘上输入 555667777abc 后,y 的值为( )。(分数:2.00)A.5660 B.555660C.77770D.5667770解析:解析:它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。其中的格式命令可以说明最大域宽。在百分号()与格式码之间的整数用于限制从对应域读入的最大字符数。所以j 的值为 55,y 的值为 5660,字符数组 name 为 7777abc。