(13)下面选项中合法的字符常量是
A) "X"
B) 'X'
C) 'abc'
D) '\'
答案:B
【解析】字符常量是用单引号括起来的一个字符。A选项中,使用双引号,所以是错误的; C选项中,'abc'是字符串,字符常量只能是单个字符,不能是字符串;D选项中,以反斜线"\"开头的是转义字符。因此B选项正确。
(14)有以下程序
#include <stdio.h>
main()
{
int a, b, c=241;
a = c/100 % 9;
b = ( -1 )&&( -1 );
printf("%d, %d\n", a, b );
}
程序运行后的输出结果是
A) 2,1
B) 6,1
C) 6,0
D) 2,0
答案:A
【解析】程序执行过程为:c=241,c/100=2,2%9=2,得a=2;“=”优先级低于“&&”,非0值为真,0值为假,即(-1)为真,逻辑与表达式(-1)&&(-1)为真,得b=1。A选项正确。
(15)有以下程序
#include <stdio.h>
int sub(double a, double b)
{
return (int)(a - b - 1.3);
}
main( )
{
printf("%d\n", sub(3.2, 4.1));
}
程序运行后的输出结果是()。
A) -2
B) 1.7
C) -3
D) 2.0
答案:A
【解析】sub函数输出(int)(a - b - 1.3)将结果强制转化为整型,因此可以排除B、D选项,sub(3.2,4.1)=-2,故答案为A选项。
(16)若有定义:int a=0,b=0,c=0,d=0;,以下关于C语言表达式:(++a || ++b) ? ++c : ++d 执行顺序的叙述正确的是()。
A) 先执行++a,表达式++a的值为1;再执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c
B) 先执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c
C) 先执行++b,表达式++b的值为1;再执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c
D) 先执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c
答案:B
【解析】表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3,++a表示先将变量a+1,再执行其他操作,逻辑或运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(++a || ++b)中,左操作数++a的值为1,已经可以确定整个逻辑表达式的结果为1,因此右操作数++b不再求解,直接执行表达式2,即++c,答案为B选项。
(17)若有定义语句:
int a=3,b=2,c=1;
以下选项中错误的赋值表达式是()。
A) a=(b=4)=3;
B) a=b=c+1;
C) a=(b=4) +c;
D) a=1+(b=c=4);
答案:A
【解析】不能将变量或常量赋给一个表达式,所以A选项中(b=4)=3是错误的
(18)有以下程序
#include <stdio.h>
main()
{ int i=0;
i = ~ i;
printf("%d\n",i);
}
程序运行后的输出结果是()。
A) 8
B) 0
C) 1
D) -1
答案:D
【解析】本题考查位运算中按位取反,0按位取反就是-1,所以选项D正确。
(19)有以下程序
#include <stdio.h>
main()
{
char c1,c2,c3,c4,c5,c6;
scanf("%c%c%c%c", &c1,&c2,&c3,&c4);
c5=getchar();
c6=getchar();
putchar(c1);
putchar(c2);
printf("%c%c\n",c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123<回车>
45678<回车>
则输出结果是()。
A) 1245
B) 1256
C) 1278
D) 1267
答案:A
【解析】Scanf按照格式字符进行输入,所以123与回车的值分别送入了c1、c2、c3、c4变量的存储空间。getchar()函数的功能是从键盘输入的字符串中读入一个字符,所以4送入了变量c5的存储空间,5送入了变量c6的存储空间。所以打印时结果为1245。
(20)设有定义:
int n = 1234;
double x = 3.1415;
则语句
printf("%3d,%1.3f\n", n, x);
的输出结果是
A) 1234,3.142
B) 123,3.142
C) 1234,3.141
D) 123,3.141
答案:A
【解析】函数printf()中,%md指输出带符号的十进制整数,给定最小宽度为m位,不足m位左端补空格,超过m位按实际位数输出,%.nf表示以小数形式输出实数,小数占n位,对应题目,答案为A选项。
(21)设变量均已正确定义,若要通过
scanf("%d%c%d%c",&a1,&c1,&a2,&c2);
语句为变量a1和a2赋数值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正确的是(注:□代表空格字符)
A) 10□X<回车>
20□Y<回车>
B) 10□X20□Y<回车>
C) 10X<回车>
20Y<回车>
D) 10□X□20□Y<回车>
答案:C
【解析】输入数据的格式必须与scanf()的格式控制串完全匹配,如果A、B、D选项中在数字10后面均输入了空格,则会将空格赋给变量c1,而不是把X赋给c1,所以选择C选项。
(22)有以下程序
#include <stdio.h>
main()
{ char b[3][10]; int i;
for (i=0; i<2; i++)
scanf("%s", b[i]);
gets(b[2]);
printf("%s%s%s\n", b[0],b[1],b[2]);
}
执行时若从第一列输入:Fig flower is red. <回车>
则输出结果是
A) Figflower is red.
B) Figfloweris red.
C) Figflowerisred.
D) Fig flower is red.
答案:A
【解析】scanf()函数从输入设备按照指定的类型输入对应类型的若干个数据,遇到空格、制表符和回车时,读取结束。gets()函数从标准输入设备键盘上读取1个字符串(可以包含空格),并将其存储到字符数组中去。此函数的读取结束符是换行符,即当遇到一个换行符时,就停止读操作,并且换行符不能够作为字符串的内容来存储,系统会自动用“\0”来代替。可知读到第一个空格时b[0]赋值结束,为Fig,读到第二个空格时b[1]赋值结束,为flower,退出for循环执行gets()函数,空格为有效字符,b[2]=“ is red.” ,之后打印三个字符串,A选项正确。
(23)若有以下程序
#include <stdio.h>
main()
{ int a=1,b=2,c=3,d=4;
if ((a=2) || (b=1)) c=2;
if ((c==3) && (d=-1)) a=5;
printf("%d,%d,%d,%d\n", a,b,c,d);
}
则程序的输出结果是()。
A) 1,2,3,4
B) 2,1,2,-1
C) 5,1,2,-1
D) 2,2,2,4
答案:D
【解析】第一个if语句的判断条件中是逻辑或表达式,所以只要有一个运算对象为真结果就为真,且如果前面的已经为真,后面的表达式不再进行执行判断。执行第一个if判断条件时a的值为2,整个表达式的值为真,b的值不变,c的值为2。判断第二个if条件为逻辑与表达式,只有两个运算对象均非零,才为真,第一个表达式c==3,不成立,不再判断第二个运算对象,所以不执行d=-1操作和a=5操作。所以结果为选项D。
(24)有以下程序:
#include <stdio.h>
main()
{ int x=1, y=0, a=0, b=0;
switch (x)
{ case 1:
switch(y)
{ case 0: a++; break;
case 1: b++; break;
}
case 2: a++; b++; break;
case 3: a++; b++;
}
printf("a=%d, b=%d\n", a, b);
}
程序的运行结果是( )。
A) a=2,b=2
B) a=2,b=1
C) a=1,b=1
D) a=1,b=0
答案:B
【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不在进行判断,直到碰到break或函数结束为止。所以执行内层switch(y)时只执行了a++,此时a的值为1。然后执行外层case 2语句的a++;b++;a为2,b为1。所以结果为B)。
(25) 有以下程序
#include <stdio.h>
main( )
{ int m,n;
scanf("%d%d", &m,&n);
while(m!=n)
{ while(m>n) { m=m-n; }
while(n>m) { n=n-m; }
}
printf("%d\n",m);
}
该程序的功能是()。
A) 计算m和n的最小公倍数
B) 计算m和n的最大公约数
C) 计算m和n的差值
D) 找出m和n中的较大值
答案:B
【解析】题目使用更相减损术求最大公约数,其思想:1、任意给定两个正整数,判断它们是否都是偶数。若是,则用2约简,若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
因此。故答案为B选项
(26)有以下程序
#include <stdio.h>
main( )
{ int a=1, b=0;
for(; a<5; a++)
{ if (a%2 == 0) break;
continue;
b += a;
}
printf("%d \n", b);
}
程序运行后的输出结果是()。
A) 0
B) 1
C) 10
D) 4
答案:A
【解析】题干中for循环有break和continue语句,且均放在b+=a语句前面,无论if条件是否满足,b+=a都不会被执行,因此b值始终为0,答案为A选项。
(27)若有以下定义
int x[10], *pt=x;
则对x数组元素的正确引用是()。
A) pt+3
B) *&x[10]
C) *(pt+10)
D) *(x+3)
答案:D
【解析】没有A选项的引用形式。*与&放在一起作用抵消,所以B选项错误,最大只能引用到x[9]。*(pt+i)表示引用指针pt所指元素后的第i个元素,所以C选项错误,最大只能为*(pt+9)。因此D选项正确。
(28)有以下程序
#include <stdio.h>
main()
{
int a[4][4]={ {1,4,3,2},{8,6,5,7},{3,7,2,5},{4,8,6,1}}, i, k, t;
for (i=0; i<3; i++)
for (k=i+1; k<4; k++)
if (a[i][i] < a[k][k])
{ t=a[i][i]; a[i][i]=a[k][k]; a[k][k]=t;}
for (i=0; i<4; i++)
printf("%d,", a[0][i]);
}
程序运行后的输出结果是()。
A) 1,1,2,6,
B) 6,2,1,1,
C) 6,4,3,2,
D) 2,3,4,6,
答案:C
【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]、…、a[3][2]、a[3][3]的值为1、4、…、6、1。通过for嵌套循环语句和if条件语句,对二维数组对角线元素进行由大到小的排序操作,程序最后通过for语句输出二维数组第1行的4个元素。因此C选项正确。
(29)有以下程序
#include <stdio.h>
main()
{ int a[3][4]={ 1,3,5,7,9,11,13,15,17,19,21,23}, (*p)[4]=a,i,j,k=0;
for( i=0; i<3; i++ )
for( j=0; j<2; j++ ) k=k+*(*(p+i)+j);
printf("%d\n", k );
}
程序运行后的输出结果是
A) 108
B) 68
C) 99
D) 60
答案:D
【解析】该题首先给二维数组赋值a[3][4]={{1,3,5,7}{9,11,13,15}{17,19,21,23}};(*p)[4]=a指针p指向二维数组a的首地址,接下来执行for循环,首先 i=0,j=0时k=k+*(*(p+0)+0)=1(a[0][0]);然后 i=0,j=1时k=k+*(*(p+0)+1)=4(a[0][1]);然后j=2时,跳出j的循环,执行i的循环i=1,j=0 时k=k+*(*(p+1)+0)=13(a[1][0]);依次类推一直到i=3时跳出全部循环。循环语句在这里的功能是累加二维数组第1列和第2列的元素,累加结果为60。
(30)有以下程序
#include <stdio.h>
#include <string.h>
main( )
{ char a[] = "TEXT", *b = "++", c[3] = "1";
printf("%d,%d,", strlen(a), sizeof(a));
printf("%d,%d,", strlen(b), sizeof(b));
printf("%d,%d,\n", strlen(c), sizeof(c));
}
程序运行后的输出结果是()。
A) 4,5,2,4,1,3,
B) 4,4,2,2,1,1,
C) 5,5,3,3,2,2,
D) 4,4,2,2,1,3
答案:A
【解析】sizeof( )是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。strlen(*char)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL,返回的长度大小不包括NULL。sizeof(a)求数组a所占空间的大小,包括字符串最后的'\0',所以sizeof(a)=5,strlen()遇到'\0'就结束,strlen(a)=4。strlen(b)是指针指向的字符串长度,sizeof(b)是指针的大小。strlen(c)是字符串的长度,sizeof(c)是数组的长度。因此,输出4,5,2,4,1,3。故答案为A选项
(31)有以下程序
#include <stdio.h>
#include <string.h>
main( )
{ char a[20]="ab",b[20]="cdef";
int k=0;
strcat(a,b);
while(a[k]!='\0') { b[k]=a[k]; k++;}
puts(b);
}
程序的运行结果是()。
A)abcdef
B)cbcdef
C)cdef
D)ab
答案:A
【解析】strcat(字符串1, 字符串2)函数是把字符串2连接到字符串1的后面,最终结果存放到字符组1中,因此本题把a,b字符串连接起来放在a数组中,while语句完成功能是再将a字符串赋给b字符串,因此答案为A选项。
(32)以下叙述中正确的是()。
A) 函数名允许用数字开头
B) 函数调用时,不必区分函数名称的大小写
C) 调用函数时,函数名必须与被调用的函数名完全一致
D) 在函数体中只能出现一次return语句
答案:C
【解析】B选项中,函数调用时,函数名称是需要区分大小写的;A选项中,函数名不允许以数字开头;D选项中,在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行。因此C选项正确。
(33)有以下程序
#include <stdio.h>
int f(int x);
main()
{ int n=1,m;
m=f(f(f(n))); printf("%d\n",m);
}
int f(int x)
{ return x*2; }
程序运行后的输出结果是()。
A) 4
B) 2
C) 8
D) 1
答案:C
在C语言中,需要在main函数后面定义函数,需要提前声明,否则调用报错,无法找到该函数。m=f(f(f(n))),一共调用3次f()函数,f()函数是对n*2,因此,结果是n*2*2*2,得到结果为8。故答案为C选项。
(34)有以下程序
#include <stdio.h>
int d=1;
void fun( int p )
{
int d=5;
d += p++;
printf("%d ", d );
}
main()
{
int a=3;
fun( a );
d += a++;
printf("%d\n",d);
}
程序的输出结果是()。
A) 8 4
B) 9 6
C) 9 4
D) 8 5
答案:A
【解析】本题主要考查局部变量和全局变量的区别,题目中函数之外定义的d为全局变量,函数fun内定义的d为局部变量,所以执行fun函数后,打印出8,执行完d += a++;后d变为4,所以答案为A。
(35)函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回给调用函数,函数不完整。
int fun(int *a,int n)
{ int *p,*s;
for( p=a,s=a; p-a<n;p++ )
if(__________) s=p;
return *s;
}
在if语句下划线处应填入的选项是()。
A) p>s
B) *p>*s
C) a[p]>a[s]
D) p-a>p-s
答案:B
【解析】函数fun的功能是在a所指的具有n个元素的数组中查找最大值并返回。通过for比较,s始终指向最大值的那个元素。取指针的值,使用*p,因此比较使用*p和*s,又因为找最大值,当*s<*p时,修改指针s的指向,因此答案为B选项
(36)设有以下函数:
void fun(int n,char *s)
{ …… }
则下面对函数指针的定义和赋值均正确的是()。
A) void (*pf)(int,char); pf=&fun;
B) void *pf(); pf=fun;
C) void *pf(); *pf=fun;
D) void (*pf)(int, char*); pf=fun;
答案:D
【解析】函数的参数可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。函数名代表函数的入口地址,指向函数的指针应该定义为void (*pf)()。如果定义为void *pf(),则表示函数pf返回值为一个基类型为void的指针。因此D选项正确。
(37)有以下程序
#include <stdio.h>
#define SUB( X, Y ) (X+1)*Y
main()
{ int a=3, b=4;
printf("%d\n",SUB(a++ ,b++ ));
}
程序运行后的输出结果是()。
A) 25
B) 20
C) 12
D) 16
答案:D
【解析】本题考查宏定义,宏定义只是做个简单的替换,执行SUB(a++ ,b++)=(a++ +1)*b++=16,选项D正确。
(38)若有定义
typedef int *T;
T a[20];
则以下与上述定义中a类型完全相同的是()。
A) int *a[20];
B) int (*a)[20];
C) int a[20];
D) int **a[20];
答案:A
【解析】“typedef 类型名 新类型名”表示为一个已有定义的类型标识符重新定义一个类型名,题中选项A代表的意思是数组指针,即指向数组的指针,B选项是指针数组,即数组存放的元素是整型指针,首先为整型指针类型命名为T,再通过T定义了一个整形指针数组*a[20],等价于int *a[20],答案为A选项。
(39)为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域)则在()处填入的选项是( )。
struct link{ char data;()}node;
|
|
data next
A) struct link *next;
B) link next;
C) link *next;
D) struct link next;
答案:A
【解析】存储结构用链式存储。链式结构每个节点有个指针域,指针域指向下一个链式结构的节点,因此指针域的结构应该是该结构形式,因此应定义为struct link* next,故答案为A选项。struct是结构体的说明符,不能省略
(40)有以下程序段
FILE *fp;
if( (fp=fopen("test.txt","w")) == NULL)
{ printf("不能打开文件!");
exit(0);}
else
printf("成功打开文件!");
若指定文件test.txt不存在,且无其他异常,则以下叙述错误的是
A) 输出"不能打开文件!"
B) 输出"成功打开文件!"
C) 系统将按指定文件名新建文件
D) 系统将为写操作建立文本文件
答案:A
【解析】fopen函数以一定方式打开指定文件,返回一个指向文件的文件指针,如果不能实现打开指定文件的操作,则返回一个空指针NULL。如果指定文件不存在则创建一个文件名为指定文件名的新文件,然后打开它。在指定文件有错误或者指定文件不存在却不能创建新文件的情况下,打开文件操作错误,返回空指针。本题程序中,文件test.txt不存在,但无其他异常,表示可以建立新文件,命名为test.txt,C选项叙述正确,并以只写方式打开它,D选项叙述正确,返回指向文件的指针,if条件不成立,输出“成功打开文件!”,B选项叙述正确,A选项叙述错误。所以选择A选项。