文档库 最新最全的文档下载
当前位置:文档库 › C语言习题集合(预处理命令)

C语言习题集合(预处理命令)

C语言习题集合(预处理命令)
C语言习题集合(预处理命令)

第六章预处理命令

6.1 选择题

1.下面叙述中正确的是()。

A. 带参数的宏定义中参数是没有类型的

B. 宏展开将占用程序的运行时间

C. 宏定义命令是C语言中的一种特殊语句

D. 使用#include命令包含的头文件必须以“.h”为后缀

2.下面叙述中正确的是()。

A. 宏定义是C语句,所以要在行末加分号

B. 可以使用#undef命令来终止宏定义的作用域

C. 在进行宏定义时,宏定义不能层层嵌套

D. 对程序中用双引号括起来的字符串内的字符,与宏名相同的要进行置换

3.在“文件包含”预处理语句中,当#include后面的文件名用双引号括起时,寻找被包含文件的方式为()。

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

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

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

D. 仅仅搜索当前目录

4.下面叙述中不正确的是()。

A. 函数调用时,先求出实参表达式,然后带入形参。而使用带参的宏只是进行简单的

字符替换

B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进

行的,在展开时也要分配内存单元,进行值传递

C. 对于函数中的实参和形参都要定义类型,二者的类型要求一致,而宏不存在类型问

题,宏没有类型

D. 调用函数只可得到一个返回值,而用宏可以设法得到几个结果

5.下面叙述中不正确的是()。

A. 使用宏的次数较多时,宏展开后源程序长度增长。而函数调用不会使源程序变长

B. 函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进

行的,在展开时不分配内存单元,不进行值传递

C. 宏替换占用编译时间

D.函数调用占用编译时间

6.下面叙述中正确的是( )。

A. 可以把define和if定义为用户标识符

B.可以把define定义为用户标识符,但不能把if定义为用户标识符

C. 可以把if定义为用户标识符,但不能把define定义为用户标识符

D. define和if都不能定义为用户标识符

7.下面叙述中正确的是()。

A.#define和printf都是C语句

B.#define是C语句,而printf不是

C.printf是C语句,但#define不是

D.#define和printf都不是C语句

8.以下叙述中正确的是()。

A. 用#include包含的头文件的后缀不可以是“.a”

B. 若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,

包含此头文件所有源程序不必重新进行编译

C. 宏命令行可以看作是一行C语句

D. C编译中的预处理是在编译之前进行的

9.下列程序运行结果为()。

#define R 3.0

#define PI 3.1415926

#define L 2*PI*R

#define S PI*R*R

main()

{

printf("L=%f S=%f\n",L,S);

}

A. L=18.849556 S=28.274333

B. 18.849556=18.849556 28.274333=28.274333

C. L=18.849556 28.274333=28.274333

D. 18.849556=18.849556 S=28.274333

10.以下程序执行的输出结果是( )。

#define MIN(x,y) (x)<(y)?(x):(y)

main()

{

int i,j,k;

i=10;j=15;

k=10*MIN(i,j);

printf("%d\n",k);

}

A.15

B.100

C.10

D.150

11.下列程序执行后的输出结果是( )。

#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

12.以下程序的输出结果是( )。

#define M(x,y,z) x*y+z

main()

{

int a=1,b=2, c=3;

printf("%d\n", M(a+b,b+c, c+a));

}

A. 19

B. 17

C. 15

D. 12 13.程序中头文件typel.h 的内容是( )。

#define N 5

#define M1 N*3

程序如下:

#include "type1.h"

#define M2 N*2

main()

{

int i;

i=M1+M2;

printf("%d\n",i);

}

程序编译后运行的输出结果是()。

A. 10

B. 20

C. 25

D. 30 14.请读程序:

#include

#define SUB(X,Y) (X)*Y

main()

{

int a=3, b=4;

printf("%d", SUB(a++, b++));

}

上面程序的输出结果是()。

A. 12

B. 15

C. 16

D. 20 15.执行下面的程序后,a的值是( )。

#define SQR(X) X*X

main( )

{

int a=10,k=2,m=1;

a/=SQR(k+m)/SQR(k+m);

printf("%d\n",a);

}

A. 10

B. 1

C. 9

D. 0 16.设有以下宏定义

#define N 3

#define Y(n) ((N+1)*n)

则执行语句:z=2 * (N+Y(5+1));后,z的值为( )。

A. 出错

B. 42

C. 48

D. 54 17.以下程序的输出结果是( )。

#define f(x) x*x

main( )

{

int a=6,b=2,c;

c=f(a) / f(b);

printf("%d\n",c);

}

A. 9

B. 6

C. 36

D. 18

18.有如下程序

#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

19.执行如下程序后,输出结果为()。

#include

#define N 4+1

#define M N*2+N

#define RE 5*M+M*N

main()

{

printf("%d",RE/2);

}

A.150

B.100

C. 41

D.以上结果都不正确20.以下程序的输出结果是()。

#define LETTER 0

main()

{

char str[20]= "C Language",c;

int i;

i=0;

while((c=str[i])!=’\0’)

{

i++;

#if LETTER

if(c>=’a’&&c<=’z’) c=c-32;

#else

if(c>=’A’&&c<=’Z’) c=c+32;

#endif

printf("%c",c);

}

}

A. C Language

B. c language

C. C LANGUAGE

D. c LANGUAGE 6.2 填空题

1.以下程序的输出结果是________。

#define MAX(x,y) (x)>(y)?(x):(y)

main()

{

int a=5,b=2,c=3,d=3,t;

t=MAX(a+b,c+d)*10;

printf("%d\n",t);

}

2.下面程序的运行结果是________。

#define N 10

#define s(x) x*x

#define f(x) (x*x)

main()

{

int i1,i2;

i1=1000/s(N);

i2=1000/f(N);

printf("%d,%d\n",i1,i2);

}

3.设有如下宏定义

#define MYSWAP(z,x,y) {z=x; x=y; y=z;}

以下程序段通过宏调用实现变量a、b内容交换,请填空。

float a=5,b=16,c;

MYSWAP( 【1】 ,a,b);

4.计算圆的周长、面积和球的体积

【1】

main()

{

float l,r,s,v;

printf("input a radus: ");

scanf("%f ", 【2】 );

l=2.0*PI*r;

s=PI*r*r;

v=4.0/3*( 【3】 );

printf("l=%.4f\n s=%.4f\n v=%.4f\n",l,s,v);

}

5.计算圆的周长、面积和球的体积

#define PI 3.1415926

#define 【1】 L=2*PI*R; 【2】 ;

main()

{

float r,l,s,v;

printf("input a radus: ");

scanf("%f",&r);

CIRCLE(r,l,s,v);

printf("r=%.2f\n l=%.2f\n s=%.2f\n v=%.2f\n", 【3】 );

}

6.3 答案及部分解析

一.选择题答案

1.A

2.B

3.B

4.B

5.D

6.B

7.D 8.D 9.A 10.A 11.B 12.D 13.C 14.A 15.B 16.C 17.C 18.B 19.C 20.B

1. 解析:关于宏的习题,我们要牢记一点:宏展开只是简单的字符串替换。宏名无类型,

宏的参数也没有类型,所以选项A)是正确的。宏展开是在正式编译以前进行的,

不会占用程序的运行时间,而会占用编译时间,所以选项B)错误。规定所有的

编译预处理命令都不是C语言中的语句,因而,编译预处理命令不以分号作为结

束符,所以选项C)错误。头文件习惯上以“.h”为后缀,但它只是习惯而不是

规定。所以选项D)错误。

9. 解析:注意双引号中的宏名不被展开,所以输出结果为L=18.849556 S=28.274333,而

不是18.849556=18.849556 28.274333=28.274333。

10.解析:宏展开就是简单的字符串替换。语句k=10*MIN(i,j);经过宏展开为

k=10*(i)<(j)?(i):(j);。由于*号的优先级要高于<号的优先级,因此要先进行

10*(i)的运算;把值带入宏展开式为k=10*10<15?10:15;,条件表达式的值为15。

所以选项A)是正确的。

20.解析:条件编译的命令总共有三种:一种是#ifdef 标识符…#else…#endif,作用是当

标识符被定义过,就编译前一段程序,否则编译后一段程序;第二种是#ifdef 标

识符…#else…#endif,作用是当标识符未被定义过,就编译前一段程序,否则

编译后一段程序;第三种是#if 表达式…#else…#endif,作用是表达式的值为

“真”时编译前一段程序,否则编译后一段程序。本例题中,由于表达式LETTER

的值为0,所以编译if(c>’A’ && c<’Z’) c=c+32;语句,结果为c language。二.填空题答案

1.答案:7

2.答案:1000,10

3.答案:【1】 c

4.答案:【1】 #define PI 3.1415926 【2】 &r 【3】 PI*r*r*r 5.答案:【1】CIRCLE(R,L,S,V) 【2】S=PI*R*R;V=PI*R*R*R*4/3 【3】r,l,s,v

相关文档