【例5】(2002年9月)有以下程序
main()
{ unsigned char a,b;
a=4|3;
b=4&3;
printf("%d %d\n",a,b);
}
执行后输出结果是( )。
A. 7 0 B. 0 7
C. 1 1 D. 43 0
【答案】A
【考点解析】a=3|4=0000 0011|0000 0100=0000 0111,b=0000 0100&0000 0011=0000 0000,a的十进制值是7,b的十进制值是0,所以选择A。
【例6】(2003年4月)char型变量x中的值为10100111,则表达式(2+x)^(~3)的值是( )。
A. 10101001 B. 10101000
C. 11111101 D. 01010101
【答案】D
【考点解析】(2+x)^(~3)=(0000 0010+1010 0111)^(~0000 0011)=1010 1001^1111 1100=0101 0101,所以选D。
7.4文件操作
一、选择题
【例1】(2000年4月)在C程序中,可把整型数以二进制形式存放到文件中的函数是( )。
A. fprintf函数 B. fread函数
C. fwrite函数 D. fputc函数
【答案】C
【考点解析】fwrite函数能够通过设置参数实现向文件写入数据以二进制形式存放到文件。
【例5】(2002年9月)以下叙述中错误的是( )。
A. 二进制文件打开后可以先读文件的末尾,而顺序文件不可以
B. 在程序结束时,应当用fclose函数关闭已打开的文件
C. 在利用fread函数从二进制文件中读数据时,可以用数组名给数组中所有元素读入数据
D. 不可以用FILE定义指向二进制文件的文件指针
【答案】D
【考点解析】FILE的指针既可以指向二进制文件又可以指向文本文件。
【例7】(2003年9月)若fp已正确定义并指向某个文件,当未遇到该文件结束标志时函数feof(fp)的值为( )。
A. 0 B. 1
C. -1 D. 一个非0值
【答案】A
【考点解析】当遇到文件尾函数feof返回一个非0值,若没有遇到文件尾函数feof返回0。
【例8】(2003年9月)下列关于C语言数据文件的叙述中正确的是( )。
A. 文件由ASCII码字符序列组成,C语言只能读写文本文件
B. 文件由二进制数据序列组成,C语言只能读写二进制文件
C. 文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件
D. 文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件
【答案】D
【考点解析】C语言既能读写文本文件,又能读写二进制文件,所以选项A和B错误;C语言文件由数据流的形式组成,故C错误。
【例10】(2004年4月)有以下程序(提示:程序中fseek(fp,-2L*sizeof(int), SEEK_END);语句的作用是使位置指针从文件尾向前移2*sizeof(int)字节)
#include <stdio.h>
main( )
{ FILE *fp;int i,a[4]={1,2,3,4},b;
fp=fopen("data.dat","wb");
for(i=0;i<4;i++) fwrite(&a[i],sizeof(int),1,fp);
fclose(fp);
fp=fopen("data.dat","rb");
fseek(fp,-2L*sizeof(int),SEEK_END) ;
fread(&b,sizeof(int),1,fp);/*从文件中读取sizeof(int)字节的数据到变量b中*/
fclose(fp);
printf("%d\n",b) ;
}
执行后输出结果是( )。
A. 2 B. 1
C. 4 D. 3
【答案】D
【考点解析】for循环语句中利用函数fwrite将4个整数写到文件data.dat中,然后用fseek函数将文件位置指针从文件尾向前移动4个字节,即指向了第三个整数3,再利用fread函数读取一个整型变量到b,所以b的值为3。
【例11】(2004年9月)有如下程序
#include <stdio.h>
main()
{ FILE*fp1;
fp1=fopen("f1.txt","w");
fprintf(fp1,"abc");
fclose(fp1);
}
若文本文件f1.txt中原有内容为:good,则运行以上程序后文件f1.txt中的内容为( )。
A. goodabc B. abcd
C. abc D. abcgood
【答案】C
【考点解析】fopen函数中文件的使用方式是“w”,表示如果原来不存在这文件就打开时建立一个以指定名字命名的文件,如果以存在一个以该名字命名的文件,就在打开时将该文件删除,然后建立一个新的,所以答案选C。
【例33】(2003年9月)若程序中已包含头文件stdio.h, 以下选项中,正确运用指针变量的程序段是( )。
A. int *i=NULL; B. float *f=NULL;
scanf("&d",i); *f=10.5;
C. char t="m", *c=&t; D. long *L;
*c=&t; L='\0';
【答案】D
【考点解析】C语言中NULL表示空指针,对空指针所指的内容操作是没有意义的,所以选项A和B是错误的;选项C中*c=&t是错误的,不能把字符型变量t的地址赋值给字符型指针所指的内容。
【例34】(2003年9月)有以下程序
#inc1ude <stdio.h>
main()
{ printf("%d\n", NULL); }
程序运行后的输出结果是( )。
A. 0 B. 1
C. -1 D. NULL没定义,出错
【答案】A
【考点解析】C语言中NULL表示空指针,指向内存地址为0的单元,内容为0。
第7章 编译预处理、结构体、共用体、位运算与文件操作
7.1编译预处理
一、选择题
【例1】(2000年4月)下列程序执行后的输出结果是( )。
#define MA(x) x*(x-1)
main()
{int a=1,b=2; printf("%d \n",MA(1+a+b));}
A. 6 B. 8
C. 10 D. 12
【答案】B
【考点解析】先进行宏展开在进行运。
MA(1+a+b)=(1+a+b)*((1+a+b)-1)=1+1+2*(1+1+2-1)=8
【例2】(2000年9月)有如下程序
#define N 2
#define M N+1
#define NUM 2*M+1
main()
{ int i;
for(i=1;i<=NUM;i++)printf("%d\n",i);
}
该程序中的for循环执行的次数是( )。
A. 5 B. 6
C. 7 D. 8
【答案】B
【命题目的】考查C语言宏定义。
【考点解析】程序先进行宏展开在进行运算,所以N的值是2,M的值是3,NUM=2*M+1= 2*N+1+1=2*2+1+1=6,所以进行了6次循环。
【例6】(2004年4月)有以下程序
#define f(x) x*x
main( )
{ int i;
i=f(4+4)/f(2+2);
printf("%d\n",i);
}
执行后输出结果是( )。
A. 28 B. 22
C. 16 D. 4
【答案】A
【考点解析】先进行宏展开再进行运算,i=4+4*4+4/2+2*2+2=28。
7.2结构体、共用体
7.3位运算
一、选择题
【例1】(2000年4月)设int b=2;表达式(b<<2)/(b>>1)的值是( )。
A. 0 B. 2
C. 4 D. 8
【答案】D
【考点解析】b用二进制形式表示为0000 0010,左移两位,0000 1000,变为8,右移一位,0000 0001,变为1,所以选D。
【例2】(2001年9月)以下程序的输出结果是( )。
main()
{ int x=0.5; char z='a';
printf("%d\n",(x&1)&&(z<'z'));
}
A. 0 B. 1
C. 2 D. 3
【答案】A
【考点解析】x为整型,所以x的值为0,x&1=0&1=0,0&&(z<’z’)=0。
【例3】(2002年4月)以下程序的输出结果是( )。
main()
{ char x=040;
printf("%o\n",x<<1);
}
A. 100 B. 80
C. 64 D. 32
【答案】A
【考点解析】x的二进制形式为00 100 000左移一位后变为01 000 000化为八进制形式为100。
main()
{ char s[ ]="ABCD", *p;
for(p=s+1; p<s+4; p++)printf ("%s\n",p);
}
该程序的输出结果是( )。
A. ABCD B. A C. B D. BCD
BCD B C CD
CD C D D
D D
【答案】D
【考点解析】字符指针p先指向s+1,通过四次循环使p分别指向s+1、s+2、s+3、s+4并输出。
【例13】(2001年4月)下列程序的输出结果是( )。
main()
{
char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
printf("%d",*--p);
}
A. 非法 B. a[4]的地址 C. 5 D. 3
【答案】C
【考点解析】p是指向字符的指针并初始化为a[5]的地址。输出时先进行自减使p指向a[4]再输出a[4]中的内容。
【例14】(2001年4月)下列程序的运行结果是( )。
void fun(int *a, int *b)
{
int *k;
k=a; a=b; b=k;
}
main()
{
int a=3, b=6,*x=&a,*y=&b;
fun(x,y);
printf("%d %d",a,b);
}
A. 6 3 B. 3 6 C. 编译出错 D. 0 0
【答案】B
【考点解析】main函数中定义了两个整型指针x、y分别指向变量a、b,将x、y作为实际参数调用fun,在fun里实现把x跟y的值调换,使得x指向b,y指向a,但是并没有改变a和b的值。
【例16】(2001年4月)假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在此可执行文件所在目录的DOS提示符下键入:PROG ABCDEFGH IJKL<回车>,则输出结果为( )。
main( int argc,char *argv[ ])
{ while(--argc>0)printf("%s",argv[argc]);
printf("\n");
}
A. ABCDEFG B. IJHL
C. ABCDEFGHIJKL D. IJKLABCDEFGH
【答案】D
【考点解析】main函数的参数argc是命令行中参数的个数,*argv[ ]是一个指针数组指向命令行中的字符串首地址,题中argc=3通过循环先后输出argv[2]和argv[1]。
【例20】(2002年4月)若有定义:int aa[8];则以下表达式中不能代表数组元aa[1]的地址的是()。