编译预处理 一.选择题 1.在下列代码中,正确的C代码是( ) ①# define MYNAME=“ABC” ②# include string.h ③ for(i=0;i<10; i++); ④ struct int stu { int name };
2.在下列代码中,正确的C代码是( ) ①# define PI=3.14159 ② include“stdio.h” ③ for(i=0,i<10, i++) a++; ④static struct { int i;} b ={2};
3.在下列代码中,错误的C代码是( ) ①# define PI 3.14159 ②# include“stdio.h”; ③ if(2); ④ for(;;) if(1) break;
4.设有以下定义,则执行语句“z=2*(N+Y(5+1));”后,z的值为( ) # define N 3 # define Y(n)((N+l)*n) ①出错 ②42 ③48 ④54
5.以下程序中的for循环执行的次数是( ) # include<stdio.h> # define N 2 # define M N+1 # define NUM(M+l)* M/2 main() { int i, n=0; for( i= l; i<=NUM;i++) { n++; printf(“%d”,n); } printf(“\n”); } ①5 ②6 ③8 ④9 二.填空题 1.“FILE *p”的作用是定义一个______,其中的“FILE”是在________头文件中定义的。
2.在对文件进行操作的过程中,若要求文件的现行位置回到文件的开头,应当调用的函数是_______函数。
三.程序分析题 1.假定在当前盘当前目录下有2个文本文件,其名称和内容如下: 文件名 al.txt a2.txt 内容 121314 # 252627# 写出运行下列程序后的输出。 # include<stdio.h> # include<stdlib.h> void fc( FILE *); main() { FILE *fp; if( fp= fopen(“al.txt”, “r”))== NULL) { printf(“Can not open file! \n”); exit(l); } else { fc(fp); fclose(fp); } if(( fp = fopen(“a2.txt”,“r”))==NULL) { printf(“Can not open file! \n”); exit(1); } else { fc(fp); fclose(fp); } void fc(FILE *fp1) { char c; while((c=fgetc(fpl))!=‘#’) putchar(c); } 「解」程序以读方式打开文件a1.txt,若能正常打开,则调用函数fc.接着同样地,以读方式打开文件a2.txt,若能正常打开,也调用函数fc.函数企从指定的文件读入字符,在读入字符不是字符‘#’情况下循环,将读人字符输出。对于文件a1.txt,程序输出121314,对于文件a2.txt,程序输出252627.所以程序输出121314252627.
答案解析 1.③「解」①是关于宏定义的,在宏的定义形式中,宏名与字符列之间至少有一个空白符,并在宏名希望代表的字符序列之间也不能有任何非空格类字符,若有也被当作是字符序列的一部分。有了宏定义,以后程序中若要有宏名后的字符序列就可简写成宏名。选择①在宏名之后紧接字符=, 所以不是正确的C代码. ②是关于包含命令的,在上述包含命令的格式中,被包含文件应放在一对尖括号之间,或一对双引号之间,不可在文件名字符列的首末没有这种符号。③是for语句,for语句的循环体可以用空语句,从语言的句法规则来说,该语句是正确的。但通常循环是为了完成某种重复计算操作,单一地让一个变量循环增1到某个值,程序员是不会编写这种代码的。④是想定义结构类型,定义结构时,struct后接结构类型名,不可在结构名之前插入某些其它类型符。正确解答是③。
2.④「解」①定义时,宏名与被定义的字符列之间不可以插入等号等其它字符。选择答案②是包含文件预处理,所有的预处理命令都应由字符# 开始于新的一行。③在写for语句时,其中的三个表达式必须用字符“;”分隔。④在定义结构变量时,结构的类型名可以省缺,并可为结构变量赋初值。为结构变量赋初值,必须顺序给出各成分的初值,并将初值写在一对花括号中。这里给出的结构变量定义的代码是正确的。正确解答是④。
3.②「解」①是正确的宏定义。②的文件包含预处理命令行不可以有多余的分号字符。③是if语句,虽没有任何意义,但就句法来说是正确的。④是for语句,其成分语句是if语句,从for语句来说,是一个无穷循环的控制结构,但它的成分语句因条件成立,执行break语句,立即退出循环。同样虽也是一条没有任何意义的语句,但从句法规则来说,也是正确的。正确解答是②。
4.③「解」在新的宏定义中,可以使用前面已定义的宏名。另外,宏调用是这样被替换展开的,分别用宏调用中的实在参数字符序列替换成定义字符序列中对应所有出现的形式参数。而宏定义字符序列中的不是形式参数的其他字符则保留。这样形成的字符序列,即为宏调用的展开替换结果。所以代码“z=2*(N+Y(5+1));”被替换成: z=2*(3+((3+1)*5+1)); 执行该代码,将使z的值为48. 解答为③。
5.③「解」代码NUM被替换成(2+1+1)*2+1/2,所以其值是8. 所以程序中的循环执行的次数是8次。正确解答是③。
二.填空题 1.「解」代码“FILE *p”的作用是定义一个文件指针变量,其中的FILE是在标准输入输出头文件stdio.h中定义的。
2.「解」若要让文件随机地从某个现行位置回到文件的开头,可调用库函数rewind()。
三.程序分析题 1.「解」程序以读方式打开文件a1.txt,若能正常打开,则调用函数fc.接着同样地,以读方式打开文件a2.txt,若能正常打开,也调用函数fc.函数企从指定的文件读入字符,在读入字符不是字符‘#’情况下循环,将读人字符输出。对于文件a1.txt,程序输出121314,对于文件a2.txt,程序输出252627.所以程序输出121314252627.
|
|
来自: running_to_you > 《编译预处理》