(12)在源程序的开始处加上
#include <stdio.h>
进行文件引用的原因,以下叙述正确的是()。
A) stdio.h文件中包含标准输入输出函数的函数说明,通过引用此文件以便能正确使用printf、scanf等函数
B) 将stdio.h中标准输入输出函数链接到编译生成的可执行文件中,以便能正确运行
C) 将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接
D) 将stdio.h中标准输入输出函数的源程序插入到引用处,以便进行编译链接
答案:A
【解析】stdio.h文件中包含标准输入输出函数的函数说明,预处理指令#include<stdio.h>是使程序可以去该文件中找到printf,scanf等函数以便使用,因此答案为A选项。
(13)有以下程序
#include <stdio.h>
main()
{
printf("%d\n", NULL );
}
程序运行后的输出结果是()。
A) 0
B) 变量无定义,输出不确定
C) -1
D) 1
答案:A
【解析】NULL是在stdio.h头文件中定义的预定义符,NULL的代码值为0,如果以整型格式输出则输出0。A选项正确。
(14)有如下程序
#include <stdio.h>
#include <string.h>
main()
{
printf("%d\n", strlen("0\n011\1"));
}
程序运行后的输出结果是
A) 6
B) 8
C) 9
D) 4
答案:A
【解析】由一对双引号括起来的一串字符为字符串。字符常量是用一对单引号括起来的单个字符,还有一些特殊字符常量,即以“\”开头的转义字符。“\”后可以为某些单个字符也可以为八进制或十六进制数字。strlen函数统计字符串长度,遇到“\0”统计结束。‘0’‘\n’‘0’‘1’‘1’‘\1’共6个字符,A选项正确。
(15)以下非法的定义语句是()。
A) long b=0L;
B) unsigned int a= -100u;
C) short c2=0123;
D) int d=0x0;
答案:B
【解析】unsigned定义的是"无符号数",则B选项定义错误,答案为B选项。
(16)不能正确表示数学式的表达式是
A) a/c*b
B) a*b/c
C) a/ b* c
D) a*(b/c)
答案:C
【解析】/号和*号的优先级处于平级,结合性都是自左至右。所以选择C,C式子表示的是。
(17)有以下程序
#include <stdio.h>
main()
{
int a=2, c=5;
printf( "a=%%d,b=%%d\n", a,c );
}
程序的输出结果是()。
A) a=2,b=5
B) a=%2,b=%5
C) a=%d,b=%d
D) a=%%d,b=%%d
答案:C
【解析】C语言中用"%%"打印输出字符"%",所以%%d,输出为%d两个普通字符,而不是格式控制符"%d"的含义,所以打印结果为C。
(18)以下选项中错误的是()。
A) a&=b 与 a=a&b 等价
B) a^=b 与 a=a^b 等价
C) a|=b 与 a=a|b 等价
D) a!^=b 与 a=a!^b 等价
答案:D
【解析】D选项中,a!=b表示a不等于b时,运算结果为1,或者为0;而a=a!b是一种语法错误,!是非运算,且是单目运算符,只要求有一个操作数,故两者不等价,答案为D选项。
(19)有以下程序段:
#include <stdio.h>
int a,b,c;
a=10; b=50;c=30;
if (a>b) a=b,b=c; c=a;
printf("a=%d b=%d c=%d\n", a,b,c);
程序的输出结果是( )。
A) a=10 b=50 c=30
B) a=10 b=50 c=10
C) a=10 b=30 c=10
D) a=50 b=30 c=50
答案:B
【解析】本题中a>b的条件不满足,所以不执行逗号表达式a=b,b=c;的操作,而是执行c=a操作,即c的值为10。
(20) 有如下嵌套的if语句
if(a<b)
if(a<c) k=a;
else k=c;
else
if(b<c) k=b;
else k=c;
以下选项中与上述if语句等价的语句是
A) k=(a<b)?((b<c)?a:b):((b>c)?b:c);
B) k=(a<b)?((a<c)?a:c):((b<c)?b:c);
C) k=(a<b)?a:b;k=(b<c)?b:c;
D) k=(a<b)?a:b;k=(a<c)?a:c;
答案:B
【解析】题目中嵌套语句的含义是当a<b且a<c成立,则将a的值赋给k,如果a<b成立而a<c不成立将c的值赋给k。如果a<b不成立而b<c成立,将b的值赋给k,如果如果a<b不成立且b<c也不成立,将c的值赋给k。判断条件表达式只有B选项可以表示这个含义。
(21) 有以下程序段:
#include <stdio.h>
int i, n;
for( i=0; i<8; i++ )
{ n = rand() % 5;
switch (n)
{ case 1:
case 3: printf("%d \n", n); break;
case 2:
case 4: printf("%d \n", n); continue;
case 0: exit(0);
}
printf("%d \n",n);
}
以下关于程序段执行情况的叙述,正确的是( )。
A) for循环语句固定执行8次
B) 当产生的随机数n为4时结束循环操作
C) 当产生的随机数n为1和2时不做任何操作
D) 当产生的随机数n为0时结束程序运行
答案:D
【解析】case常量表达式只是起语句标号作用,并不是该处进行条件判断。在执行switch语句时,根据switch的表达式,找到与之匹配的case语句,就从此case子句执行下去,不再进行判断,直到碰到break或函数结束为止。简单的说break是结束整个循环体,而continue是结束单次循环。B)选项中当产生的随机数n为4时要执行打印操作。C)选项中当产生的随机数为1和2时分别执行case3与case4后面语句的内容。由于存在break语句所以for循环不是固定执行8次,执行次数与产生的随机数n有关系。
(22) 有如下程序
#include <stdio.h>
main()
{
int i, *ptr;
int array[3] = {8,2,4};
for (ptr=array, i=0; i<2; i++)
printf("%d,", *ptr++);
printf("\n");
}
程序运行后的输出结果是()。
A) 8,2,
B) 8,8,
C) 2,4,
D) 4,8,
答案:A
【解析】程序执行过程为:定义指针ptr与数组array,执行for循环,使指针指向数组,i=0,输出指针指向的元素array[0]=8,然后指针加1,指向数组下一个元素;i=1,输出array[1]=2,指针指向数组下一个元素;i=2退出for循环。程序依次输出8,2,A选项正确。
(23)有以下程序
#include <stdio.h>
main()
{
int i, j, x=0;
for(i=0; i<2; i++)
{
x++;
for( j=0; j<=3; j++)
{
if(j%2) continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
程序执行后的输出结果是
A) x=4
B) x=8
C) x=6
D) x=12
答案:B
【解析】coutinue的作用是跳出循环体中剩余的语句而进行下一次循环。第一次执行外循环i的值为0,执行x++,x的值变为1,第一次执行内层循环j的值为0,不满足if条件,执行x++,x的值变为2,第二次内循环j的值为1,if条件成立,跳出本次循环,第三次执行内循环j的值为2,不满足if条件,x的值变为3,第四次执行内循环j的值为3满足条件跳出本次内循环,x的值加1,即为4,第一次外循环结束。第二次执行外循环时,同理,i的值被加了,4次,变为8,所以选择B选项。
(24)设有如下程序段
int a[1] = {0};
int b[] = {9};
char c[3] = {"A", "B"};
char d = "12";
以下叙述正确的是()。
A) a, b的定义合法,c, d的定义不合法
B) a,b,c,d的定义都是合法的
C) a,b,c的定义是合法的,d的定义不合法
D) 只有a的定义是合法的
答案:A
【解析】int a[1]={0}表示定义一个数组a[1]初值为0,int b[] = {9},表示定义一个数组b,其中只有一个值9,系统自动识别数组有1个元素。char c[3] = {"A", "B"},数组元素为字符串,需要用二维数组来表示,C选项错误; char d = "12";,字符串常量不能赋值给字符变量,D选项错误;因此答案为A选项。
(25)设有定义
double a[10] ,*s=a;
以下能够代表数组元素a[3]的是()。
A) (*s)[3]
B) *(s+3)
C) *s[3]
D) *s+3
答案:B
【解析】指针的赋值首先基类型必须一致,s二维数组名,是二维数组的首地址,其基类型是一个具有10个元素的字符数组。p是一个字符指针变量,其基类型是一个字符,k是一个行指针,其基类型是具有3个元素的字符型数组。所以A、C、D中两项的基类型不一致。而B选项,s[0]是二维数组s的第一个元素,其代表第一行元素构成的数组的首地址,其相当于一维数组的数组名,其基类型是一个字符类型,和p基类型一致。因此B选项正确。
(26)#include <stdio.h>
#define N 4
void fun(int a[][N])
{
int i;
for(i=0; i<N; i++)
a[0][i] += a[N-1][N-1-i];
}
main( )
{ int x[N][N]={ {1, 2, 3, 4},
{5, 6, 7, 8},
{9,10,11,12},
{13,14,15,16}}, i;
fun(x);
for (i=0;i<N; i++) printf("%d,", x[i][i]);
printf("\n");
}
程序运行后的输出结果是()。
A) 4,7,10,13,
B) 1,6,11,16,
C) 17,6,11,16,
D) 5,13,21,29,
答案:C
【解析】N=4,for(i=0,i<N,i++) printf(x[i][j]);此语句输出x[0][0], x[1][1],x[2][2],x[3][3],其中只有x[0][0]的值在fun函数中发生改变,在fun函数中,当i=0时,x[0][0]= x[0][0]+x[3][3]=17,程序运行后的输出结果是:17.6.11.16。因此答案为C选项。
(27)有以下程序
#include <stdio.h>
main()
{
char ch[ ] ="uvwxyz",*pc;
pc=ch;
printf("%c\n", *(pc+5));
}
程序运行后的输出结果是()。
A) z
B) 0
C) 元素ch[5]的地址
D) 字符y的地址
答案:A
【解析】语句pc=ch;使得指针变量指向字符数组ch的首地址,即指向字符'u'。则pc+5指向的是字符向后移动5位,指向字符'z'。所以输出的*pc+5的值即为'z'。因此A选项正确。
(28)有以下程序
#include <stdio.h>
#include <string.h>
void fun (char *w, int m )
{ char s, *p1, *p2;
p1=w; p2=w+m-1;
while ( p1<p2 )
{
s=*p1; *p1=*p2; *p2=s;
p1++; p2--;
}
}
main()
{ char a[ ]="123456";
fun ( a, strlen(a) ); puts(a);
}
程序运行后的输出结果是()。
A) 123456
B) 116611
C) 161616
D) 654321
答案:D
【解析】主函数中调用fun(a,6)后,指针p1指向字符串中的"1"、p2指向字符串中的"6"。While循环中,只要p1<p2,则把p1、p2所指向的字符互换,同时p1前移,p2后移。最终字符串逆序存放。因此D选项正确。
(29)若有以下程序
#include <stdio.h>
main()
{ char a[20], b[ ]="The sky is blue."; int i;
for (i=0; i<10; i++) scanf("%c", &a[i]);
a[i]='\0';
gets(b);
printf("%s%s\n", a,b);
}
执行时若输入:
Fig flower is red. <回车>
则输出结果是()。
A) Fig flower is red.is blue.
B) Fig flower is red.
C) Fig floweris red.
D) Fig floweris
答案:B
【解析】本题考查字符数组的赋值以及字符串的处理函数,本题中输入字符串Fig flower is red时,首先是将前10个字符赋值给字符数组a,然后执行gets(b)后,将后续字符存放到b中,当输出时,首先输出字符数组a,然后输出字符串b,所以结果为B选项。
(30)有以下程序
#include <stdio.h>
main()
{ char s[]="012xy\08s34f4w2";
int i, n=0;
for ( i=0; s[i]!=0; i++ )
if(s[i] >= '0' && s[i] <= '9') n++;
printf("%d\n",n);
}
程序运行后的输出结果是()。
A) 7
B) 0
C) 3
D) 8
答案:C
【解析】题意统计字符s中阿拉伯数字的个数。char s[]='012xy\08s34f4w2';元素是字符型。'0'=48;而'\0'=0;因此可以计算出'\0'之前阿拉伯数字的个数,由字符串s可知,有3个阿拉伯数字。答案为C选项。
(31)若有定义语句:
char *s1="OK", *s2="ok";
以下选项中,能够输出"OK"的语句是()。
A) if (strcmp(s1,s2)!=0) puts(s2);
B) if (strcmp(s1,s2)!=0) puts(s1);
C) if (strcmp(s1,s2)==1) puts(s1);
D) if ( strcmp(s1,s2)==0) puts(s1);
答案:B
【解析】strcmp(s1,s2)是字符串比较函数,比较规则是两个字符串自左向右逐个字符相比(按照ASCII码值大小),以第一个不相同的字符的大小作为比较结果。因为'OK'<'ok',所以strcmp(s1,s2)为负值,只有B选项正确。
(32)以下关于return语句的叙述中正确的是()。
A) 一个自定义函数中必须有一条return语句
B) 一个自定义函数中可以根据不同情况设置多条return语句
C) 定义成void类型的函数中可以有带返回值的return语句
D) 没有return语句的自定义函数在执行结束时不能返回到调用处
答案:B
【解析】在函数中允许有多个return语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值,A选项描述错误。定义成void类型的函数,不允许从该函数取得返回值,也不允许使用return语句,C选项描述错误。没有return语句的函数在执行到函数的最后一条语句后会自动返回到调用处,D选项描述错误。因此B选项正确。
(33)若有以下程序
#include <stdio.h>
int *f(int *s, int *t)
{ int k;
if (*s < *t) { k = *s; *s=*t; *t=k; }
return s;
}
main()
{ int i=3, j=5, *p=&i, *q=&j, *r;
r=f(p,q);
printf("%d,%d,%d,%d,%d\n", i, j, *p, *q, *r);
}
则程序的输出结果是()。
A) 5,3,3,5,5
B) 3,5,5,3,5
C) 3,5,3,5,5
D) 5,3,5,3,5
答案:D
【解析】在主函数中分别给整型变量i、j和指针型变量p、q赋初值,并声明指针变量r;调用f函数,并将实参变量p和q的值传递给形参变量s和t,并且f函数是指针型函数,即函数的返回值将是一个地址。在f函数中,如果条件成立,则将指针变量s和t的值互换,并且将指针s的地址返回主函数。最后输出i, j, *p, *q, *r的值,即5,3,5,3,5。因此D选项正确。
(34)有以下程序
#include <stdio.h>
int m=12;
int fun( int x,int y )
{ static int m=3;
m= x * y - m ;
return (m);
}
main()
{ int a=7, b=5;
m=fun( a, b )/m;
printf("%d\n", fun( a, b )/m );
}
程序运行后的输出结果是()。
A) 2
B) 1
C) 3
D) 0
答案:B
局部变量覆盖全局变量,但是全局变量的声明周期还存在。f()函数调用完成后,由于m全局变量,被修改为32,即函数的返回值32,此时m=32/12,第二次调用f(a,b),函数的返回值为3,此时m=2,故输出为1。所以答案为B选项
(35)若有以下程序
#include <stdio.h>
int f(int a[], int n)
{ if (n > 1)
{ int t;
t=f(a, n-1);
return t > a[n-1] ? t : a[n-1];
}
else
return a[0];
}
main()
{ int a[] = {8,2,9,1,3,6,4,7,5};
printf("%d\n", f(a, 9));
}
则程序的输出结果是()。
A) 9
B) 1
C) 8
D) 5
答案:A
【解析】本题主要考查了函数的递归调用,解题思路只需要将参数带入函数中,首先是执行f(a, 9),递归执行(a, 8)直到(a, 2),得到a[0]=8,然后判断a[0]是否大于a[1],本题实际上就是求出数组a元素的最大值。答案为9,选项A正确。
(36)以下叙述正确的是()。
A) 表达式 sizeof(FILE*) == sizeof(int*) 的值为真
B) 文件指针的值是一个整数,它的值一定小于文件字节数
C) 文件指针的值是所指文件的当前读取位置
D) 使用fscanf函数可以向任意类型的文件中写入任意数量的字符
答案:A
【解析】sizeof(FILE*)=4,因为file* 为指针,指针的大小4 ,sizeof(int*)=4,理由同前面。文件指针的值是地址,是一个16进制的数,它的值不一定小于文件字节数,因此选项B错误。文件指针是所指文件的当前读取位置,而不是文件指针的值因此选项C错误。intfscanf(FILE*stream,constchar*format,[argument...]);
fscanf函数可以向任意类型的文件,写入任意数量不能超过系统的缓冲区,写文件先写入缓冲区,最后一起写入文件,因此选项D错误。答案为A选项
(37)以下叙述中正确的是()。
A) int* p1; int ** p2; int *p3;都是合法的定义指针变量的语句
B) 指针变量只能通过求地址运算符(&) 来获得地址值
C) 语句p=NULL;与p=\0;是等价的语句
D) 语句p=NULL;执行后,指针p指向地址为0的存储单元
答案:A
【解析】B选项描述不正确,指针变量可以通过求地址运算符(&) 来获得地址值,可以通过指针变量获得地址值,还可以通过标准函数获得地址值;C选项中,p=NULL;和p=0;或p='\0';等价;D选项中,语句p=NULL;执行后,指针p并不是指向地址为0的存储单元,而是具有一个确定的值-"空"。因此A选项正确。
(38)有以下程序
#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *s)
{ int *t;
t=(int *)malloc(2 * sizeof(int));
*t=*p1 + *p1++;
*(t+1)=*p1+ *p1;
s=t;
}
main()
{
int a[2]={1,2},b[2]={0};
fun(a,b);
printf("%d,%d\n",b[0],b[1]);
}
程序运行后的输出结果是
A) 2,6
B) 0,0
C) 2,4
D) 1,2
答案:B
【解析】malloc函数的原型为:malloc(size);,函数的作用是在内存的动态存储区分配一个长度为size的连续空间。程序执行过程为:定义数组a={1,2},b={0,0},b,调用函数fun,将数组地址传入函数,指针p1指向a,s指向b,定义指针t并使其指向开辟的两个整型内存,为第一个内存赋值为数组a第一个元素的2倍,即2,然后指针p1指向a数组第二个元素,为第二个内存赋值为数组a第二个元素的2倍,即4,最后使指针s指向动态开辟的两个内存的首地址。整个过程中数组b没有发生变化,依次输出b中元素为0,0,B选项正确。
(39)有以下程序
#include <stdio.h>
#define FNA(x) x*x
#define FNB(x) x+x
main()
{ int a=2,b=4;
printf("%d,%d\n",FNA(FNB(a)),FNB(FNA(b)));
}
程序运行后的输出结果是()。
A) 8,16
B) 16,32
C) 8,32
D) 16,16
答案:C
【解析】带参数的宏定义不是进行简单的字符串替换,而是要进行参数替换。替换过程是:用宏调用提供的实参字符串,直接置换宏定义命令行中相应形参字符串,非形参字符保持不变。FNA(FNB(a))的替换过程为:FNA(2+2)替换为2+2*2+2,计算结果为8。FNB(FNA(b))的替换过程为:FNB(4*4)替换为4*4+4*4=32。程序运行后的输出结果是8,32,C选项正确。
(40)若有以下程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu {
char *name, gender;
int score;
} STU;
void f(char *p)
{
p=(char *)malloc(10);
strcpy(p, "Qian");
}
main()
{
STU a={NULL, 'm', 290}, b;
a.name=(char *)malloc(10);
strcpy( a.name, "Zhao" );
b = a;
f(b.name);
b.gender = 'f'; b.score = 350;
printf("%s,%c,%d,", a.name, a.gender, a.score);
printf("%s,%c,%d\n", b.name, b.gender, b.score);
}
则程序的输出结果是()。
A) Zhao,m,290,Qian,f,350
B) Zhao,m,290,Zhao,f,350
C) Qian,f,350,Qian,f,350
D) Qian,m,290,Qian,f,350
答案:B
【解析】本题考查结构体变量中的引用,其中a的name为Zhao,b执行函数f(b.name)后b的name并没有改变,还是Zhao,所以答案为B选项。