2024年4月27日发(作者:)

参考答案

第 9 章 编译预处理

一、

选择

1

A

11

C

二、编程题

略。

2

D

12

C

3

C

13

B

4

D

14

C

5

C

15

A

6

D

16

B

7

A

17

A

8

B

18

B

9

B

10

D

习 题

一、选择题

(1)编译预处理的工作是在( A )完成的。

A)编译前 B)编译时 C)编译后 D)执行时

(2)以下选项汇总,( D )不属于编译预处理。

A)宏定义 B)文件包含 C)条件编译 D)连接

(3)以下选项中,( C )是C语句。

A)#include B)#define PI 3.1415926

C)j++; D)a=3

(4)以下叙述中错误的是( D )。

A)在程序中凡是以“#”开始的语句行都是预处理命令行

B)预处理命令行的最后不能以分号结束

C)“#define MAX 3 ”是合法的预处理命令行

D)C程序对预处理命令行的处理是在程序执行的过程中进行的

(5)以下关于宏的叙述中正确的是( C )。

A)宏名必须用大写字母表示 B)宏定义必须位于源程序中所有语句之前

C)宏展开没有数据类型限制 D)宏调用比函数调用耗费时间

(6)在宏定义#define PI 3.1415926中,用宏名代替一个( D )。

A)单精度数 B)双精度数 C)常量 D)字符串

(7)设有宏定义#define A B abcd,则宏展开时( A )。

A)宏名A用B abcd替换 B)宏名A B用abcd替换

C)宏名A和宏名B都用abcd替换 D)语法错误,无法替换

(8)若程序中有宏定义行#define N 100,则以下叙述中正确的是( B )。

A)宏定义行中定义了标识符N的值为整数100

B)对C源程序进行预处理时,用100替换标识符N

C)对C源程序进行编译时,用100替换标识符N

D)在运行时,用100替换标识符N

(9)以下程序的运行结果是( B )。

#include

#define M 5

#define N M+M

void main( )

{ int k;

k=N*N*5;

printf("%dn",k);

}

A)500

C)125

(10)以下程序的运行结果是( D )。

#include

#define PT 3.5;

#define S(x) PT*x*x;

void main( )

{ int a=1, b=2;

printf("%4.1fn",S(a+b));

}

B)55

D)程序有错无输出结果

A)14.0

C)7.5

(11)以下程序的运行结果是( C )。

#include

#define N 5

#define M N+1

#define f(x) (x*M)

void main( )

{ int i1,i2;

i1=f(2);

i2=f(1+1);

printf("%d %dn",i1,i2);

}

B)31.5

D)程序有错无输出结果

A)12 12 B)12 7 C)11 7 D)11 12

(12)关于文件包含,以下说法中正确的是( C )。

A)被包含的文件必须以“.h”为后缀

B)一个#include命令可以指定多个被包含文件

C)文件包含允许嵌套

D)#include 和#include "stdio.h"没有任何区别

(13)在文件包含预处理命令中,当#include后面的文件名用双引号括起时,寻找被

包含文件的方式为( B )。

A)直接按系统设定的标准方式搜索目录

B)先在源程序所在目录搜索,若找不到,再按系统设定的标准方式搜索

C)仅搜索源程序所在目录

D)仅搜索当前目录

(14)有一个名为init. txt的文件,内容如下:

那么,以下程序的运行结果是( C )。

#include

#include ""

void main( )

{ int a=1,b=2,c=3,d=4,k;

k=HDY(a+c,b+d);

PRINT(k);

}

#define HDY(A,B) A/B

#define PRINT(Y) printf("Y=%dn",Y)

A)Y=0 B)0=0 C)Y=6 D)6=6

(15)下面程序由两个源文件f1.h和f1.c组成,程序的运行结果是( A )。

f1.h的源程序为

f1.c的源程序为

#define N 10

#define f2(x) (x*N)

#include

#define M 8

#define f(x) ((x) *M)

#include "f1.h"

void main( )

{ int i,j;

i=f(1+1);

j=f2(1+1);

printf("%d %dn",i,j);

}

A)16 11 B)16 20 C)9 11 D)9 20

(16)关于条件编译,下列说法错误的是( B )。

A)条件编译允许嵌套

B)条件编译与if条件语句没有任何区别

C)条件编译可以使用#endif D)每条条件编译命令必须单独成行

(17)以下程序的运行结果是( A )。

#include

#define P 0

void main( )

{ int n=10,m;

#ifdef P

m=n+n;

#else

m=n*n;

#endif

printf("%dn",m);

}

A)20 B)100

(18)以下程序的输出结果是( B )。

#include

#define P 0

void main( )

{ int n=10,m;

#if P

m=n+n;

#else

m=n*n;

#endif

printf("%dn",m);

}

C)0 D)程序有错

A)20 B)100 C)0 D)程序有错

二、编程题

1.利用带参数的宏“#define M(a, b) a/b”,求两个整数相除的商。

2.利用带参数的宏交换两个变量的值。

3.用宏定义设计几种输出格式(包括整数、实数、字符串等),并单独放在文件“fo

rmat.h”中。另编一个程序文件,利用文件“format.h”使用这些格式。

4.定义一个带参数的宏求两个数的最大值,并单独放在一个头文件中。定义一个函

数求两个数的最小值,并单独放在一个C文件中。另编一个C程序文件,利用前两个文件

求两个数的最大值和最小值。

5.输入两个数,用条件编译,求两个数的和或两个数的乘积。

6.输入一行字符,用条件编译,将其中的大写字母变为对应的小写字母,或将其中

的小写字母变为对应的大写字母,其他字符不变。