参考答案第9章编译预处理一、选择题12345678910ADCDCDABBD1112131415161718CCBCABAB二、编程题略。习题一、选择题(1)编译预处理的工作是在(A)完成的。A)编译前B)编译时C)编译后D)执行时(2)以下选项汇总,(D)不属于编译预处理。A)宏定义B)文件包含C)条件编译D)连接(3)以下选项中,(C)是C语句。A)#includeB)#definePI3.1415926C)j++;D)a=3(4)以下叙述中错误的是(D)。A)在程序中凡是以“#”开始的语句行都是预处理命令行B)预处理命令行的最后不能以分号结束C)“#defineMAX3”是合法的预处理命令行D)C程序对预处理命令行的处理是在程序执行的过程中进行的(5)以下关于宏的叙述中正确的是(C)。A)宏名必须用大写字母表示B)宏定义必须位于源程序中所有语句之前C)宏展开没有数据类型限制D)宏调用比函数调用耗费时间(6)在宏定义#definePI3.1415926中,用宏名代替一个(D)。A)单精度数B)双精度数C)常量D)字符串(7)设有宏定义#defineABabcd,则宏展开时(A)。A)宏名A用Babcd替换B)宏名AB用abcd替换C)宏名A和宏名B都用abcd替换D)语法错误,无法替换(8)若程序中有宏定义行#defineN100,则以下叙述中正确的是(B)。A)宏定义行中定义了标识符N的值为整数100B)对C源程序进行预处理时,用100替换标识符NC)对C源程序进行编译时,用100替换标识符ND)在运行时,用100替换标识符N(9)以下程序的运行结果是(B)。#include#defineM5#defineNM+Mvoidmain(){intk;k=N*N*5;printf("%d\n",k);}A)500B)55C)125D)程序有错无输出结果(10)以下程序的运行结果是(D)。#include#definePT3.5;#defineS(x)PT*x*x;voidmain(){inta=1,b=2;printf("%4.1f\n",S(a+b));}A)14.0B)31.5C)7.5D)程序有错无输出结果(11)以下程序的运行结果是(C)。#include#defineN5#defineMN+1#definef(x)(x*M)voidmain(){inti1,i2;i1=f(2);i2=f(1+1);printf("%d%d\n",i1,i2);}A)1212B)127C)117D)1112(12)关于文件包含,以下说法中正确的是(C)。A)被包含的文件必须以“.h”为后缀B)一个#include命令可以指定多个被包含文件C)文件包含允许嵌套D)#include和#include"stdio.h"没有任何区别(13)在文件包含预处理命令中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为(B)。A)直接按系统设定的标准方式搜索目录B)先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索C)仅搜索源程序所在目录D)仅搜索当前目录(14)有一个名为init.txt的文件,内容如下:#defineHDY(A,B)A/B#definePRINT(Y)printf("Y=%d\n",Y)那么,以下程序的运行结果是(C)。#include#include"init.txt"voidmain(){inta=1,b=2,c=3,d=4,k;k=HDY(a+c,b+d);PRINT(k);}A)Y=0B)0=0C)Y=6D)6=6(15)下面程序由两个源文件f1.h和f1.c组成,程序的运行结果是(A)。f1.h的源程序为#defineN10#definef2(x)(x*N)f1.c的源程序为#include#defineM8#definef(x)((x)*M)#include"f1.h"voidmain(){inti,j;i=f(1+1);j=f2(1+1);printf("%d%d\n",i,j);}A)1611B)1620C)911D)920(16)关于条件编译,下列说法错误的是(B)。A)条件编译允许嵌套B)条件编译与if条件语句没有任何区别C)条件编译可以使用#endifD)每条条件编译命令必须单独成行(17)以下程序的运行结果是(A)。#include#defineP0voidmain(){intn=10,m;#ifdefPm=n+n;#elsem=n*n;#endifprintf("%d\n",m);}A)20B)100C)0D)程序有错(18)以下程序的输出结果是(B)。#include#defineP0voidmain(){intn=10,m;#ifPm=n+n;#elsem=n*n;#endifprintf("%d\n",m);}A)20B)100C)0D)程序有错二、编程题1.利用带参数的宏“#defineM(a,b)a/b”,求两个整数相除的商。2.利用带参数的宏交换两个变量的值。3.用宏定义设计几种输出格式(包括整数、实数、字符串等),并单独放在文件“format.h”中。另编一个程序文件,利用文件“format.h”使用这些格式。4.定义一个带参数的宏求两个数的最大值,并单独放在一个头文件中。定义一个函数求两个数的最小值,并单独放在一个C文件中。另编一个C程序文件,利用前两个文件求两个数的最大值和最小值。5.输入两个数,用条件编译,求两个数的和或两个数的乘积。6.输入一行字符,用条件编译,将其中的大写字母变为对应的小写字母,或将其中的小写字母变为对应的大写字母,其他字符不变。