C语言上机题目考试.docx
《C语言上机题目考试.docx》由会员分享,可在线阅读,更多相关《C语言上机题目考试.docx(137页珍藏版)》请在冰豆网上搜索。
C语言上机题目考试
1.有以下程序
inta=3;
main()
{ints=0;
{inta=5;s+=a++;}
s+=a++;printf("%d\n",s);
}
程序运行后的输出结果是_______。
选项:
A.8B.7C.10D.11
评析:
选项A的错误在于switch语句后面不该加分号;
选项B的错误在于switch语句要求每一个case的常量表达式的值必须互不相同;
选项C的错误在于变量a应该用括号括起来,case后面应该是常量表达式,而不是变量。
本题答案为D。
2.若有说明:
intn=2,*p=&n,*q=p;,则以下非法的赋值语句是______。
选项:
A.*p=*qB.p=qC.n=*qD.p=n
评析:
本题的考查点是指针变量的引用。
指针变量不同于整型变量和其它类型的变量,它是用来存放地址(指针)的,不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量,这样的赋值是不合法的。
本题中的答案D就属于这种情况,所以p=n;是非法的赋值语句。
故本题答案为D。
3.在说明语句:
int*f();中,标识符f代表的是______。
选项:
A.一个用于指向整型数据的指针变量
B.一个用于指向函数的指针变量
C.一个用于指向一维数组的行指针
D.一个返回值为指针型的函数名
评析:
int*f()表示f是一个函数,它带回一个指针值,这个指针是指向一个整型数据的。
本题答案为D。
4.以下程序的输出结果是______。
intf()
{staticinti=0;
ints=1;
s+=i;i++;
returns;
}
main()
{inti,a=0;
for(i=0;i<5;i++)a+=f();
printf("%d\n",a);
}
选项:
A.15B.24C.25D.20
评析:
本题主要考的是对变量存储属性的理解,一个变量被指定为静态变量,在编译时就为其分配了存储空间,程序一开始执行便被建立,直到该程序执行结束都存在,而不像动态变量只存在于函数或分程序被调用期间。
在函数多次被调用的过程中静态局部变量的值具有可继承性。
在第一次调用函数结束时,i的值是1,返回值1,第二次调用函数时,i的值保持为1,执行自加操作后,i的值变成了2,到了第三次调用时,i的值保持了上次调用结束时的值,再执行自加,值变成了3。
到第五次调用结束时,i的值是5。
而s的值不具备i的这种可继承性,每次调用时,它都先被重新赋值为1,再执行下面的操作。
本题答案为D。
5.有以下程序
main()
{inti=0,s=0;
do{
if(i%2){i++;continue;}
i++;
s+=i;
}while(i<7);
printf("%d\n",s);
}
执行后输出的结果是______。
选项:
A.21B.28C.16D.12
评析:
本题的考查点是do-while循环语句。
do-while的一般格式如下所示:
do
{语句;
}while(测试表达式);
do-while语句是先执行后判断,其执行流程是:
1、执行循环体;
2、计算测试表达式,若为非0,转向执行do,否则执行while下面的一条语句;
3、执行do-while后面的语句,即退出do-while循环。
本题中,当i=0时,i%2=0,为假不执行{i++;continue;},接着往下执行i++,此时i=1,s=s+i=1,因为i=1符合条件i<7继续循环执行,i=1时以此类推,直到i>=7时结束循环。
最后得出s=16。
故本题答案为A。
6.下面程序的输出结果是______。
main()
{inta[]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf("%d\n",*p+9);
选项:
A.1B.0C.10D.9
评析:
本题中,p=a,则表明指针p指向数组a的第一个元素,即a[0]。
指针运算符"*"的优先级高于加法运算符"+",所以"*p+9"相当于a[0]+9,即10。
本题答案为C。
7.有以下程序
inta=2;
intf(int*a)
{return(*a)++;}
main()
{ints=0;
{inta=5;
s+=f(&a);
}
s+=f(&a);
printf("%d\n",s);
}
执行后输出结果是______。
选项:
A.8B.10C.9D.7
评析:
在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。
本题中的inta=5;只在{inta=5;s+=f(&a);}内有效。
在函数之外定义的变量称为外部变量,外部变量是全局变量。
全局变量可以为本文件中其它函数所共用。
它的有效范围为:
从定义变量的位置开始到本源文件结束。
本题的开头inta=2;即为全局变量,实际上起作用的也就是这个。
故本题答案为C。
8.有如下程序
main()
{floatx=2.0,y;
if(x<0.0)y=0.0;
elseif(x<10.0)y=1.0/x;
elsey=1.0;
printf("%f\n",y);
}
该程序输出结果是______。
选项:
A.0.000000B.0.250000C.1.000000D.0.500000
评析:
本题考查的是if…else语句的使用。
x=2.0,符合第二个if语句的条件x<10.0,所以执行y=1.0/x语句,即y=1.0/2.0=0.500000。
本题答案为C。
9.若已定义:
inta[9],*p=a;并在以后的语句中未改变p的值,不能表示a[1]地址的表达式是______。
选项:
A.p+1B.++pC.a++D.a+1
评析:
本题的考查点是数组地址的表示。
选项C中,数组名所表示的数组地址不能被重新赋值。
本题答案为C。
10.设a=5、b=6、c=7、d=8、m=2、n=2,执行
(m=a>b)&&(n=c>d)
后n的值为______。
选项:
A.4B.2C.3D.1
评析:
本题的考查点是逻辑与运算。
在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。
本题中,(m=a>b)的值为0,求出整个表达式的值为0,不需执行(n=c>d),所以n仍为2。
故本题答案为B。
11.下列选项中正确的语句组是______。
选项:
A.char*s;s="Beijing"
B.chars[8];s="Beijing"
C.chars[8];s={"Beijing"}
D.char*s;s={"Beijing"}
评析:
本题的考查点是字符串的定义和赋初值。
选项A、C是对字符数组初始化,可以是逐个字符赋给数组中各元素,也可以对整个字符串赋初值,但必须是字符型(s型),并且C语言规定,只有静态存储(static)数组和外部存储(extern)数组才能初始化。
所以选项A、C都不对。
应该这样来实现:
staticchars[]="Beijing";选项B、D是想通过字符指针来实现,正确的格式是char*s;s="Beijing"。
故本题答案为D。
12.设有如下程序段
chars[20]="Beijing",*p;
p=s;
则执行p=s;语句后,以下叙述正确的是______。
选项:
A.s和p都是指针变量
B.s数组中元素的个数和p所指字符串长度相等
C.可以用*p表示s[0]
D.数组s中的内容和指针变量p中的内容相同
13.有以下程序
main()
{intm=3,n=4,x;
x=-m++;
x=x+8/++n;
printf("%d\n",x);
}
程序运行后的输出结果是______。
选项:
A.-1B.5C.3D.-2
评析:
本题考查的是混合运算。
此题考的是++在变量前或变量后如何作用。
++在变量前和变量后的唯一区别就在于在执行“++变量”所在的语句时,是先将变量加1再执行它所在语句还是先执行它所在的语句再使变量加1,当++在变量后时,也就是“变量++”,那就是先将变量值代入表达式运算后再使变量加1;而“++变量”是先使变量加1,再把加1后的结果放入表达式进行运算。
这两种情况,在执行完变量所在的语句后,它们在内存中的值都是加过1之后的值了。
所以本题中x=-m++执行后x=-3,而执行x=x+8/++n时,必须先将n加1,再代入表达式运算。
所以答案为D。
14.设有条件表达式:
(EXP)?
i++:
j--,则以下表达式中与(EXP)完全等价的是______。
选项:
A.(EXP==1)B.(EXP!
=0)C.(EXP==0)D.(EXP!
=1)
评析:
本题的考查点是C语言条件运算。
条件运算符有三个操作数。
它的形式是:
(EXP)?
exp1:
exp2。
如果EXP的值为非零,那么整个表达式的值就是表达式exp1的值,如果EXP的值为零,那么整个表达式的值就是exp2的值。
选项B的功能是判断EXP的值的是否不为0,如果不为0,则"(EXP!
=0)"的值为真;否则,"(EXP!
=0)"的值为假,与题面的条件表达式意思一致。
故本题答案为B。
15.设有以下定义
uniondata
{intd1;floatd2;}demo;
则下面叙述中错误的是______。
A.变量demo与成员d2所占的内存字节数相同
B.若给demo.d1赋99后,demo.d2中的值是99.0
C.变量demo和各成员的地址相同
D.变量demo和各成员的地址相同
评析:
本题的考查点是共用体的存储特点。
共用体的存储特点:
(1)同一块内存可以存放不同类型的数据,但在某一时刻只能存放其中的一种;
(2)共用体变量中起作用的成员是最后一次存放的成员,即在存入一个新的成员后原有的成员失去作用,所以选项D的说法是错误的;
(3)共用体变量的地址和它的成员的地址是同一个地址,且各成员的地址也相同,因为共用体成员是共同占用同一段存储空间的,所以选项B,C的说法都正确;
(4)共用体变量不能整体被赋值,也不能给共用体变量赋初值;
(5)共用体所占的内存长度等于最长的成员的长度,所以选项A的说法正确。
故本题答案为D。
16.请读程序:
#include
#include
main()
{
char*s1="AbCdEf",*s2="aB";
s1++;s2++;
printf("%d\n",strcmp(s1,s2));
}
上面程序的输出结果是______。
选项:
A.正数B.负数C.零D.不确定的数
评析:
本题的考查点是字符串比较函数strcmp()的应用。
strcmp(X1,X2)是串比较函数,当X1>X2时返回值为正数,当X1本题中"s1"、"s2"分别表示这两个串中第一个字符的地址,s1++和s2++是将指针指向串的第二个字符,指针变量s1指向的是串"bCdEf"的首地址,即"b"的地址,而指针变量s2指向的是"B"的地址。
而在字符串比较中,大小的确定是各个字符串相应位置字符的ASCII码值的大小决定的,"B"的ASCII码值为66,"b"的ASCII码值为98,所以s1>s2,返回值为正数。
故本题答案为A。
17.若a、b、c1、c2、x、y均是整型变量,正确的switch语句是______。
①
switch(a+b);
{case1:
y=a+b;break;
case0:
y=a-b;break;
}
②
switch(a*a+b*b)
{case3:
case1:
y=a+b;break;
case3:
y=b-a;break;
}
③
switcha
{casec1:
y=a-b;break;
casec2:
x=a*b;break;
default:
x=a+b;
}
④
switch(a-b)
{default:
y=a*b;break;
case3:
case4:
x=a+b;break;
case10:
case11:
y=a-b;break;
}
A.④
B.②
C.③
D.①
评析:
选项A的错误在于switch语句后面不该加分号;
选项B的错误在于switch语句要求每一个case的常量表达式的值必须互不相同;
选项C的错误在于变量a应该用括号括起来,case后面应该跟上常量表达式,而不是变量。
本题答案为D。
18.C语言源程序名的后缀是______。
选项:
A..cB..exeC..objD..cp
评析:
本题的考查点是C语言源程序名的后缀。
C语言源程序名的后缀是.c,对源程序进行编译后得到一个后缀为.obj的目标程序,然后把目标程序进行连接操作,则可得到一个后缀为.exe的可执行文件。
故本题答案为B。
19.有如下程序
#defineN2
#defineMN+1
#defineNUM2*M+1
main()
{
inti;
for(i=1;i<=NUM;i++)
printf("%d\n",i);
}
该程序中的for循环执行的次数是______。
选项:
A.8B.6C.7D.5
评析:
本题的考查点是对C语言中宏定义的理解。
分别将N,M的宏定义代入NUM的表达式中,可以得到NUM=2*2+1+1=6,所以当常数NUM作为for循环的终止条件时,应当循环6次。
故本题答案为B。
20.有以下程序
main()
{unsignedchara=2,b=4,c=5,d;
d=a|b;d&=c;printf("%d\n",d);
}
程序运行后的输出结果是______。
选项:
A.4B.3C.5D.6
评析:
本题考查的是逻辑运算。
本题中主要是进行位的逻辑运算。
将a的值转换为二进制为:
00000010,b的值转换为二进制为:
00000100,将a、b进行按位或运算(参加计算的两个位只要有一个为1,那么运算结果为1),因此此时d的二进制为:
00000110,c的值转换为二进制为:
00000101,接下来将d和c进行按位与运算(参加计算的两个位都为1,则结果为1,否则为0),结果为:
00000100,转换成十进制数结果为4。
故本题答案选B。
21.以下程序的输出结果是______。
voidfun()
{staticinta=0;
a+=2;printf("%d",a);
}
main()
{intcc;
for(cc=1;cc<4;cc++)fun();
printf("\n");
}
答案:
246
评析:
循环for(cc=1;cc<4;cc++)被执行了3次。
在函数fun中,由于a是static型变量,所以函数第1次调用后,a=2;第2次调用后,a=4;第3次调用后,a=6。
22.以下程序运行后的输出结果是______。
main()
{intp=30;
printf("%d\n",(p/3>0?
p/10:
p%3));
}
答案:
3
评析:
本题的考查点是C程序设计。
考察的主要知识点是条件表达式。
(p/3>0?
p/10:
p%3)是一个条件表达式。
条件表达式的一般形式为:
表达式1?
表达式2:
表达式3。
条件表达式的执行顺序为:
先求解表达式1,若为真则求解表达式2,此时表达式2的值就是整个条件表达式的值。
若表达式2的的值为假,则求解表达式3,表达式3的值就是整个条件表达式的值。
条件运算符的结合方向为“自右至左”。
本题中p=30,p/3>0为真,所以求解p/10的值为3,即为整个表达式的值。
23.以下函数把b字符串连接到a字符串的后面,并返回a中新字符串的长度。
请填空。
strcen(chara[],charb[])
{intnum=0,n=0;
while(*(a+num)!
=______)num++;
while(b[n]){*(a+num)=b[n];num++;______;}
return(num);
}
答案:
第一空:
‘\0’或0或NULL
第二空:
n++或++n或n+=1或n=n+1或n=1+n
评析:
第1个循环是为了计算a串的长度,串以NULL结束,所以第1个空应填'\0'或0或NULL;第2个循环是为了在a串的后面加上b串,num++是为了将a串的下标向前移动,毫无疑问,b串的下标也必须向前移动,所以第2个空必须填n++或与此等功能的其它表达式。
24.下面程序的输出是______。
main()
{intarr[10],i,k=0;
for(i=0;i<10;i++)
arr[i]=i;
for(i=1;i<4;i++)
k+=arr[i]+i;
printf("%d\n",k);
}
答案:
12
评析:
本题的考查点是for循环。
第一个循环
for(i=0;i<10;i++)
arr[i]=i;
是将数组元素0至9分别赋值为0到9;
第二个循环
for(i=1;i<4;i++)
k+=arr[i]+i;
可以变化成以下形式:
for(i=1;i<4;i++)
k=arr[i]+i+k;
将数组arr[1]、arr[2]、arr[3]的各个值计算可以得到k的最终值为12。
25.下列程序段的输出结果是______。
main()
{charb[]="Hello,you";
b[5]=0;
printf("%s\n",b);
}
答案:
Hello
评析:
字符串中,数值0或符号'\0'表示字符串的结束。
本题中,b[5]被赋了0值,表明字符串b的第六个字符就是结束标志。
因此,只输出前五个字符,即Hello。
26.以下程序的功能是:
输出a、b、c三个变量中的最小值,请填空。
#include
main()
{inta,b,c,t1,t2;
scanf("%d%d%d",&a,&b,&c);
t1=a
______;
t2=c______;
printf("%d\n",t2);
}
答案:
第一空:
a:
b
第二空:
c:
t1
评析:
本题的考查点是条件运算。
通过题意及输出语句可知,t2用来存放a,b,c三个变量中的最小值。
程序首先通过条件运算符比较变量a和b,使得其中小的那个值赋值给变量t1;然后再通过变量c与t1进行比较,将小的值赋给变量t2,从而求得a,b,c三个变量中最小的值。
条件运算符的一般形式为:
表达式1?
表达式2:
表达式3
条件运算符的执行顺序:
先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。
若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
由于t1存放是a,b中较小的数,所以当a
b",同理本题第二空填"c:
t1"。
27.下面程序的运行结果是:
______。
#defineN10
#defines(x)x*x
#definef(x)(x*x)
main()
{inti1,i2;
i1=1000/s(N);i2=1000/f(N);
printf("%d%d\n",i1,i2);
}
答案:
100010
评析:
本题的考查点是宏定义。
根据宏定义,变量i1的值为1000/10*10=1000,变量i2的值为1000/(10*10)=10。
故本题答案为:
1000和10。
28.设有定义:
floatx=123.4567;,则执行以下语句后的输出结果是______。
printf("%f\n"(int)(x*100+0.5)/100.0);
答案:
123.460000
评析:
本题考查的是表达式的运算。
输出语句的表达式:
(int)(x*100+0.5)/100.0是指先运算表达式中的"x*100+0.5",然后将其结果强制转换为int型,即:
(int)(123.4567*100+0.5)=(int)12346.17=12346,接下来进行"/100.0"的运算即:
12346/100.0=123.46,原因是除运算是双目运算,当一边是整型数,一边是实型数时,系统自动将整型转换为实型数,然后进行运算,又因为最后的的输出格式是float类型的实数,所以结果为123.460000。
29.以下程序运行后的输出结果是______。
main()
{intx=15;
while(x>10&&x<50)
{x++;
if(x/3){x++;break;}
elsecontinue;
}
printf("%d\n",x);
}
答案:
17
评析:
本题的考查点是while循环语句。
当x=15时,while条件为真,执行x++;,这时x的值为16,if条件为真,执行x++;后跳出循环体,此时x的值为17。
故本题答案为:
17。
30.若输入字符串:
abcde↙,则以下while循环体将执行______次。
while((ch=getchar())=='e')printf("*");
答案:
0或零
评析:
函数getchar()是从键盘得到用户输入的一个字符。
用户输入的第1个字符是a,不管后面输入的是什么,ch的值都是'a',因此条件(ch=getchar())=='e'为假,这个循环不会被执行。
31.有以下程序段
charch;intk;
ch='a';k=12;
printf("%c,%d,",ch,ch,k);printf("k=%d\n",k);
已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是______。
选项:
A因变量类型与格式描述符的类型不匹配输出无定值
Ba,97,k=12
Ca,97,12k=12
D输出项与格式描述符个数不符,输出为零值或不定值
评析:
本题的考查点是数据的输入与输出,输入输出函数的调用。
printf函数的参数包括格式控制和输出列表,本题的第一个printf格式控制符"%c,%d"是指输出一个字符型数据和一个整型数据(C语言规定,不管格式符的个数与输出变量的个数是否相等,则均按格式符的个数输出,如果格式符的个数小于输出变量的个数,则按自左至右的顺序,多余的变量值不输出,若格式符的个数大于输出变量的个数,则多余格式符则由程序自动输出任意值),由于字符a的ASCII码为97,所以第一个printf输出"a,97,";第二个printf用于输出整型变量k的值,即"k=12",所以本题程序输出的结果是"a,97