(12)有以下程序
#include <stdio.h>
main()
{ int k=-17;
printf("%d,%o,%x\n", k, 1-k, 1-k);
}
程序的运行结果是()。
A) -17,22,12
B) -17,12,22
C) -17,-22,-12
D) 17,22,12
答案:A
【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法。十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。1-k=18,整型常量18用八进制表示为22,十六进制表示为12,A选项正确。
(13)以下定义语句中正确的是()。
A) int a=b=0;
B) char A=65+1,b='b';
C) float a=1,*b=&a,*c=&b;
D) double a=0.0; b=1.1;
答案:B
【解析】A选项语句中b变量还没有定义不能直接用于给a变量赋值。C选项语句中*b、*c表示的是一个实型变量的地址,不能再将&b赋值给指针型变量c。D选项语句中a=0.0后面应该为逗号,不能是分号。
(14)有以下程序:
#include <stdio.h>
main()
{ int s,t,A=10; double B=6;
s=sizeof(A); t=sizeof(B);
printf("%d,%d\n",s,t);
}
在VC6.0平台上编译运行,程序运行后的输出结果是( )。
A) 10,6
B) 4,4
C) 2,4
D) 4,8
答案:D
【解析】C语言中利用sizeof()函数判断数据类型长度,在VC6.0平台中,整型int占有4个字节,double型数据占有8个字节。
(15)表达式:(int)((double)9/2)- 9%2 的值是()。
A) 0
B) 3
C) 4
D) 5
答案:B
【解析】先将整型数据9强制转换成double型,然后除以2得到的结果与double型保持一致,即为4.5,然后将4.5强制转换成整型数据4,然后计算9%2的值为1,最后计算4-1的值为3,所以选择B选项。
(16)设有定义:int x=11,y=12,z=0;,以下表达式值不等于12的是()。
A) (z,x,y)
B) (z=x,y)
C) z=(x,y)
D) z=(x==y)
答案:D
【解析】逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值。赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。成功实现赋值后以左值为返回值。逻辑表达式成立则返回1,不成立返回0。A选项逻辑表达式x==y不成立,则z=0,表达式值为0。B选项中逗号表达式x,y取y值为表达式值,然后赋值给z=12,表达式值为12。C选项逗号表达式(x,y)取y值为表达式值,然后赋值给z=12,表达式值为12。D选项逗号表达式(z,x,y)取y值为表达式值12。选择D选项。
(17)若有定义:int a=0,b=0,c=0,d=0; ,有C语言表达式 (a++ && b++) ? c++ : d++,以下关于其执行顺序的叙述正确是()。
A) 先执行a++,表达式a++的值为0,由此即可确定(a++&&b++)的值为0,因此执行d++
B) 先执行a++,表达式a++的值为0;再执行b++,表达式b++的值为0,由此可确定(a++ && b++)值为0,因此执行d++
C) 先执行a++,表确定(a++ && b++)值为1,因此执行c++达式a++的值为1;再执行b++,表达式b++的值为1,由此可
D) 先执行b++,表达式b++的值为1;再执行a++,表达式a++的值为1,由此可确定(a++ && b++)值为1,因此执行c++
答案:A
【解析】表达式1?表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3。逻辑与运算符遵循"短路求值"策略,即只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解右操作数,表达式(a++&&b++)中,左操作数a++的值为0,已经可以确定整个逻辑表达式的结果为0,因此右操作数b++不再求解,直接执行表达式3,即d++,答案为A选项
(18)有以下程序:
# include <stdio.h>
main()
{ unsigned char a=2, b=4, c=5, d;
d = a | b; d &= c; printf("%d\n", d); }
程序运行后的输出结果是( )。
A) 3
B) 4
C) 5
D) 6
答案:B
【解析】& 按位与,如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。| 按位或,两个相应的二进制位中只要有一个为1,该位的结果值为1。2的二进制为00000010,4的二进制为00000100,所以做或运算结果为00000110,该数与5即00000101做与操作结果为00000100,即4
(19)有以下程序
#include <stdio.h>
main( )
{ char c;
c=getchar();
do {
putchar(c++);
} while((c=getchar()) != '#');
}
程序运行时从第一列开始输入:abcdefg##<回车>,则输出结果是()。
A) bcdefgh$
B) bcdefgh
C) abcdefg#
D) abcdefg
答案:D
【解析】运算符"++"放在变量后面时,先参与其他操作,再对变量+1。putchar(c++)表示先输出当前c值,再对c值+1,当输入abcdef##时,在while语句中,程序输入"#",循环退出。因此输出为abcdefg,答案为D选项。
(20)若有定义:char c; int d; ,程序运行时输入: 1,2 <回车>,能把值1输入给变量c、值2输入给变量d的输入语句是
A) scanf("%c,%d", &c,&d);
B) scanf("%c%d", &c,&d);
C) scanf("%d,%f", &c,&d);
D) scanf("%d%d", &c,&d);
答案:A
【解析】scanf函数的调用格式为:scanf(格式控制串,地址列表);,格式控制串,由%开头,后跟格式字符,如c对应字符型变量,d对应整型变量。地址表列需要读入的是所有变量的地址或字符串的首地址。如果除了格式说明字符和附加格式字符外,如果还有其他字符,则在输入数据时要求按一一对应的位置原样输入这些字符,比如两个格式说明之间有一个逗号,则从键盘输入时输入量之间也应照原样输入逗号。A选项正确。
(21)有以下程序
#include <stdio.h>
main()
{ int a=1,b=2,c=3,d=0;
if (a==1 && b++==2)
if (b!=2||c--!=3)
printf("%d,%d,%d\n",a,b,c);
else printf("%d,%d,%d\n",a,b,c);
else printf("%d,%d,%d\n",a,b,c);
}
程序运行后的输出结果是()。
A) 1,3,2
B) 1,3,3
C) 1,2,3
D) 3,2,1
答案:B
【解析】else总是和最近的if配对,所以进入第一个if语句中条件判断时,因为是逻辑与操作需要两边运算对象的值均为非零值,才为真,所以需要逐个执行判断的结果为1,不再执行第二个case语句中的操作。而是进入第二个if语句条件判断,因为b!=2条件成立所以整个条件表达式的值为真,所以不再执行逻辑或的第二个运算对象(c-- !=3)c的值不变,也不再执行第一个else语句。打印a的值1,b的值3,c的值3。
(22)有以下程序
#include <stdio.h>
main()
{ int s;
scanf("%d", &s);
while( s>0 )
{ switch(s)
{ case 1: printf("%d", s+5);
case 2: printf("%d", s+4); break;
case 3: printf("%d", s+3);
default: printf("%d", s+1); break;
}
scanf("%d", &s);
}
}
运行时,若输入1 2 3 4 5 0<回车>,则输出结果是()。
A) 66656
B) 6566456
C) 66666
D) 6666656
答案:B
【解析】switch语句的执行流程是:首先计算switch后面圆括号中表达式的值,然后用此值依次与各个case的常量表达式比较,若圆括号中表达式的值与某个case后面的常量表达式的值相等,就执行此case后面的语句,执行后遇break语句就退出switch语句;若圆括号中表达式的值与所有case后面的常量表达式都不等,则执行default后面的语句。然后退出。所以输入1时打印65,输入2时打印6,输入3时打印64,输入4时打印5,输入5时打印6。
(23)设有以下代码
do {
while (条件表达式1)
循环体A;
} while (条件表达式2);
while (条件表达式1)
{
do {
循环体B;
} while (条件表达式2);
}
其中,循环体A与循环体B相同,以下叙述正确的是()。
A) 循环体A与循环体B的执行次数相同
B) 循环体A比循环体B的执行次数多一次
C) 循环体A比循环体B的执行次数少一次
D) 循环体A与循环体B的执行次数不确定
答案:A
【解析】while循环语句一般形式为:while(表达式){循环体},执行过程为:首先判断表达式,成立(非0)则执行循环体,不成立(0)则退出循环。do…while循环语句一般形式为:do{循环体}while(表达式),执行过程为:首先执行循环体,之后判断表达式,成立(非0)则再一次执行循环体,不成立(0)则退出循环。假设表达式1与表达式2成立次数为n1与n2。若n1>n2,则循环体A执行次数为n2+1,B执行次数n2+1;若n1<n2,则循环体A执行次数为n1,B执行次数n1,A选项正确。
(24)有以下程序
#include <stdio.h>
main( )
{ int a=0, b=0;
for(; a<5; a++)
{ if (a%2==0) continue;
b += a;
break;
}
printf("%d \n", b);
}
程序运行后的输出结果是()。
A) 1
B) 4
C) 0
D) 10
答案:A
【解析】for语句中,当a=0时,满足for循环中if语句的条件,执行continue继续下一次循环,a+1后再进入for语句循环,此时a=1不满足if语句,执行b=b+a为1,接着执行break语句,终止循环,最后输出b=1,故答案为A选项。
(25)有以下程序
#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) *2*6
B) *3*5
C) *5
D) *7
答案:D
【解析】do...while语句是先执行后判断,所以第一次先执行循环体,判断i%3= =1的条件,由于i为5所以余数为2,条件不成立,执行i++,i的值为6,判断while条件为真,第二次执行循环体,同第一次循环体的执行过程一样,i的值变为7,判断while条件为真,第三次执行循环体,此时i%3= =1条件成立,判断i%5==2也成立,打印*与i的值,即*7,然后执行break语句,跳出循环。所以选择D选项。
(26)有以下程序
#include <stdio.h>
main()
{ int c[6]={10,20,30,40,50,60}, *p,*s;
p = c; s = &c[5];
printf("%d\n", s-p );
}
程序运行后的输出结果是()。
A) 5
B) 50
C) 6
D) 60
答案:A
【解析】首先初始化一维数组c[6],语句p = c;指将c[0]元素的地址赋给指针变量p;语句s = &c[5];指将c[5] 元素的地址赋给指针变量s。程序最后输出s-p,即结果为5。因此A选项正确。
(27)有以下程序
#include <stdio.h>
void fun( int a[ ], int n, int flag )
{ int i=0,j, t;
for ( i=0; i<n-1; i++ )
for ( j=i+1; j<n; j++ )
if ( flag )
{ if ( a[i] < a[j] )
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
else
{ if ( a[i] > a[j] )
{ t = a[i]; a[i] = a[j]; a[j] = t; }
}
}
main( )
{ int c[10]={ 7,9,10,8,3,5,1,6,2,4 },i;
fun( c, 4, 1 );
fun( c+4, 6, 0 );
for ( i=0;i<10; i++ ) printf( "%d,", c[i] );
printf("\n");
}
程序运行后的输出结果是()。
A) 7,8,9,10,6,5,4,3,2,1
B) 10,9,8,7,6,5,4,3,2,1
C) 10,9,8,7,1,2,3,4,5,6,
D) 1,2,3,4,5,6,7,8,9,10,
答案:C
【解析】fun()函数作用冒泡法排序,flag控制升序(0)或者降序(1)。n为参与排序的个数。a为数组的起始地址。因此,fun(a,4,1),数组的前四个降序排序,fun(a+4,6,0)从数组的第四项,后六个升序排序。故结果为10,9,8,7,1,2,3,4,5,6。答案为C选项
(28)下列选项中,能正确定义数组的语句是()。
A) int num[0...2008];
B) int num[];
C) int N=2008;
int num[N];
D) #define N 2008
int num[N];
答案:D
【解析】C语言不允许定义动态数组,定义数组的大小必须为常量表达式。A选项错误,C语言中数组没有此类型的定义方法;B选项错误,定义数组应指明数组大小,如果不指明数组大小,需要给定初值的个数;C选项错误,N为变量,不能用来定义数组大小。因此D选项正确。
(29)有以下程序
#include <stdio.h>
main()
{
int a[4][4]={{1,4,3,2},
{8,6,5,7},
{3,7,2,5},
{4,8,6,1}};
int i, j, k, t;
for (i=0; i<4; i++)
for (j=0; j<3; j++)
for (k=j+1; k<4; k++)
if (a[j][i] > a[k][i])
{
t=a[j][i];
a[j][i] = a[k][i];
a[k][i] = t;
} /* 按列排序 */
for (i=0; i<4; i++)
printf("%d, ",a[i][i]);
}
程序运行后的输出结果是()。
A) 1, 6, 2, 1,
B) 8, 7, 3, 1,
C) 4, 7, 5, 2,
D) 1, 6, 5, 7,
答案:D
【解析】首先对二维数组进行赋值操作,a[0][0]、a[0][1]、…、a[3][2]、a[3][3]的值为1、4、…、6、1。通过for语句和if语句,对二维数组各列元素进行由小到大的排序操作,程序最后通过for语句输出二维数组对角线上的元素。因此D选项正确。
(30)有以下程序
#include <stdio.h>
main( )
{ char w[20], a[5][10] = {"abcdef", "ghijkl", "mnopq", "rstuv", "wxyz"};
int i,j;
for (i=0; i<5; i++)
{ j=0;
while (a[i][j]!='\0') j++;
w[i] = a[i][j/2+1];
}
w[5]= '\0';
puts(w);
}
程序运行后的输出结果是()。
A) ekpuz
B) agmrw
C) flqvz
D) djoty
答案:A
【解析】在for循环中,执行完while语句,j值为字符串数组a的每行字符串的长度,因此w[i] = a[i][j/2+1],数组a的元素a[i][j/2+1]的值赋给一维数组w[i]。比如i=0;j=6;a[i][j/2+1]=a[0][4]='e',将此值赋给w[0]。循环依次给数组W赋值最后输出w,答案为A选项。
(31)有以下程序(strcpy为字符串复制函数,strcat为字符串连接函数)
#include <stdio.h>
#include <string.h>
main()
{ char a[10] = "abc", b[10] = "012", c[10] = "xyz";
strcpy( a+1, b+2 );
puts( strcat( a, c+1 ) );
}
程序运行后的输出结果是()。
A) a12xyz
B) bc2yz
C) a2yz
D) 12yz
答案:C
【解析】本题考查字符串处理函数strcpy和strcat,执行完strcpy( a+1, b+2 );后,a变为a2,执行完strcat( a, c+1 )后,a变为a2yz,所以答案为C选项。
(32)有以下程序
#include <stdio.h>
int f(int n)
{ int t = 0, a=5;
if (n/2) {int a=6; t += a++; }
else {int a=7; t += a++; }
return t + a++;
}
main()
{ int s=0, i=0;
for (; i<2;i++) s += f(i);
printf("%d\n", s);
}
程序运行后的输出结果是
A) 28
B) 24
C) 32
D) 36
答案:B
【解析】在主函数main()中定义了两个变量s和i,同时给s和i赋初值0。当i=0时。执行"s+=f(i);"语句,调用f()并将i的初值 0传递给形参n。首先执行if语句中内条件:n/2,条件为假。则执行else下的语句,a=7,t=7+0=7,使用return返回t,t=7+(a++)=7+5=12,此时a运算完后自增1,变为6;返回主函数中,s=0+12=12。当i=1时,执行"s+=f(i);"语句,调用f()并将i的初值1传递给形参n。首先执行if语句中的条件:n/2,条件为真,执行if下面的语句,t=0,a=6 t=0+6=6,使用return返回t,t=6+6=12,返回主函数中,s=12+12=24。最后输出的结果为24。因此B选项正确。
(33)有以下程序
#include <stdio.h>
void fun( int *a,int *b)
{ int *c;
c=a;a=b;b=c;
}
main()
{ int x=3, y=5, *p=&x, *q=&y ;
fun(p,q); printf("%d,%d,",*p,*q);
fun(&x,&y); printf("%d,%d\n",*p,*q);
}
程序运行后的输出结果是()。
A) 3,5,3,5
B) 3,5,5,3
C) 5,3,3,5
D) 5,3,5,3
答案:A
【解析】fun函数的功能是交换形式参数的值,即交换指针变量a和b的值,但是fun函数并不能够交换实参的值,因此fun(p,q)不能交换p和q的值,所以第一个printf语句的输出为3,5。第二个fun函数对x和y的地址进行了操作,同样不能交换x和y的值,并不能影响p和q指针指向的数据,因此第二个printf语句的输出也是3,5。因此A选项正确。
(34)有以下程序:
#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) 8
B) 2
C) 4
D) 1
答案:A
【解析】第一次调用m=f(f(f(1))),第二次为m=f(f(2)),第三次为m=f(4),即返回值为8。
(35)设有如下函数定义:
#include <stdio.h>
int fun( int k )
{ if (k<1) return 0;
else if (k==1) return 1;
else return fun(k-1)+1;
}
若执行调用语句:n=fun(3);,则函数fun总共被调用的次数是( )。
A) 2
B) 3
C) 4
D) 5
答案:B
【解析】首先 n=fun(3),3被当作参数传递进去,这就进行了一次调用,3被当做参数传进去后,程序会执行这句 else return fun(k-1)+1; 这就调用了第二次,而参数是3-1也就是2。2被当做参数传进去后,程序会执行这句 else return fun(k-1)+1; 这就调用了第三次,而参数是2-1也就是1。1被当做参数传进去后,程序会执行这句 else if(k==1) return 1; 不再递归调用,所以最终结果为3次。
(36)以下与存储类别有关的四组说明符中,全部属于静态类的一组是()。
A) extern和static
B) auto和static
C) register和static
D) register和extern
答案:A
【解析】auto用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字通常会被省略,因为所有的变量默认就是auto的。
register定义的变量告诉编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
static变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。当static用来修饰全局变量时,它就改变了全局变量的作用域。
extern限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。extern 外部声明, 该变量在其他地方有被定义过。因此,答案为A选项
(37)以下选项中的编译预处理命令行,正确的是()。
A) #define E 2.38
B) ##define PI_2 1.56
C) #define int INT
D) #DEFINE TRUE
答案:A
【解析】无参宏定义格式:#define 标识符 字符串,标识符与C语言规定相同,因此,可知选项B,多了#,选项C使用c语言的关键字,选项D 格式不对。因此答案为A选项。
(38)有以下程序
#include <stdio.h>
#define S(x) x/x*x
main( )
{ int k=6, j=3;
printf("%d,%d\n", S(k+j), S(j+k));
}
程序运行后的输出结果是()。
A) 27,27
B) 9,9
C) 27,29
D) 29,29
答案:C
【解析】定义一个带参数的宏时,字符串内的形参通常要用圆括号括起来,以避免出错,本题中,S(k+j)相当于执行运算k+j/k+j*k+j,将k,j值代入运算后取整为27,S(j+k)同理,因此答案为C选项。
(39)若有以下程序段
struct st{ int n; struct st *next; };
struct st a[3]={ 5,&a[1],7,&a[2],9,'\0' }, *p;
p=&a[0];
则以下选项中值为6的表达式是()。
A) p->n
B) (*p).n
C) p->n++
D) ++(p->n)
答案:D
【解析】本题考查结构体变量的引用,其中a为定义的结构体数组,D选项中p->n为5,++(p->n)为6,所以D选项正确。
(40)有以下程序
#include <stdio.h>
main()
{ FILE *fp;
int a[10]={1,2,3,0,0}, i;
fp = fopen("d2.dat", "wb");
fwrite(a, sizeof(int), 5, fp);
fwrite(a, sizeof(int), 5, fp);
fclose(fp);
fp = fopen("d2.dat", "rb");
fread(a, sizeof(int), 10, fp);
fclose(fp);
for (i=0; i<10; i++)
printf("%d,", a[i]);
}
程序的运行结果是
A) 1,2,3,0,0,0,0,0,0,0,
B) 1,2,3,1,2,3,0,0,0,0,
C) 123,0,0,0,0,123,0,0,0,0,
D) 1,2,3,0,0,1,2,3,0,0,
答案:D
【解析】本题考查文件操作函数,两次fwrite后,fp文件中已经写入1,2,3,0,0,1,2,3,0,0然后将文件fp中的内容重新写入数组a中,最后输出a为1,2,3,0,0,1,2,3,0,0,所以选项D正确。