第八章预处理命令
一、选择题
1.C语言中,宏定义有效范围从定义处开始,到源文件结束处结束,但可以用
来提前解除宏定义的作用。
(0级)
A)# ifdef B)endif C)# undefine D)# undef
2.以下不正确的叙述是。
(0级)
A)预处理命令都必须以“#”号开始
B)在程序中凡是以“#”号开始的语句行都是预处理命令行
C)C语言在执行过程中对预处理命令行进行处理
D)# define ABCD是正确的宏定义
3.以下正确的叙述是。
(0级)
A)在程序的一行中可以出现多个有效的预处理命令行
B)使用带参宏时,参数的类型应与宏定义时的一致
C)宏替换不占用运行时间,只占编译时间
D)宏定义不能出现在函数内部
4.以下不正确的叙述是。
(0级)
A)宏替换不占用运行时间
B)宏名无类型
C)宏替换只是字符替换
D)宏名必须用大写字母表示
5. 以下正确的叙述是。
(0级)
A)C语言的预处理功能是指完成宏替换和包含文件的调用
B)预处理命令只能位于C源程序文件的首部
C)凡是C源程序中行首以“#”标识的控制行都是预处理命令
D)C语言的编译预处理就是对源程序进行初步的语法检查
6.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用“”(双引号)
括起时,寻找被包含文件的方式是。
(0级)
A)直接按系统设定的标准方式搜索目录
B)先在源程序所在目录搜索,再按系统设定的标准方式搜索
C)仅仅搜索源程序所在目录
D)仅仅搜索当前目录
7.在文件包含预处理语句(# include)的使用形式中,当之后的文件名用<>(尖引号)
括起时,寻找被包含文件的方式是。
(0级)
A)直接按系统设定的标准方式搜索目录
B)先在源程序所在目录搜索,再按系统设定的标准方式搜索
C)仅仅搜索源程序所在目录
D)仅仅搜索当前目录
8.C语言的编译系统对宏命令的处理。
(0级)
A)在程序运行时进行的
B)在程序连接时进行的
C)和C程序中的其它语句同时进行编译的
D)在对源程序中其它语句正式编译之前进行的
9.以下程序的输出结果是。
(1级)
# define MIN(x,y) (x)<(y) ? (x) : (y)
main( )
{ int i,j,k; i=10; j=15; k=10*MIN(i,j); printf(“%d”,k); }
A)15 B)100 C)10 D)150
10.以下程序的输出结果是。
(2级)
# include <stdio.h>
# define ADD(y) 3.54+y
# define PR(a) printf(“%d”, (int)(a))
# define PR1(a) PR(a); putchar (…\n‟)
main( )
{ int i=4; PR1(ADD(5)*i); }
A)20 B)23 C)10 D)0
11.以下程序的输出结果是。
(2级)
# include <stdio.h>
# define N 2
# define M N+2
# define CUBE(x) (x*x*x)
main( )
{ int i=M; i=CUBE(i); printf(“%d\n”, i); }
A)17 B)64 C)125 D)53
二、填空题
1.C提供的预处理功能主要有三种,分别是、和。
(0级)
2.设有以下宏定义:# define WIDTH 80
# define LENGTH WIDTH+40
则执行赋值语句:v= LENGTH*20;(v为int型变量)后,v的值是。
(2级)
3.设有以下宏定义:# define WIDTH 80
# define LENGTH (WIDTH+40)
则执行赋值语句:k= LENGTH*20;(k为int型变量)后,k的值是。
(2级)
三、读程序写结果题
1.以下程序的输出结果是。
(2级)
# define PR(int) printf (”int=%d\n”, int)
main( )
{ int x=1,y=1,z=1; x+=y+=z; PR(x<y?y:x);
PR(x<y?x++:y++); PR(x); PR( y );
PR(z+=x<y?x++:y++); PR( y );
}
2.以下程序的输出结果是。
(2级)
# include <stdio.h>
# define PR(a) printf (”a=%d”, (int)(a))
# define PRINT(a) PR(a); putchar(…\n‟);
main( )
{ float x=3.1415,y=1.823; PRINT(2*x); PRINT(3*y*y);
}
3.以下程序的输出结果是。
(2级)
# include <stdio.h>
# define PR(a) printf (”a=%d”, (int)(a))
# define PRINT(a) PR(a); putchar(…\n‟);
# define PRINT2(a,b) PR(a), PRINT(b)
# define PRINT3(a,b,c) PR(a), PRINT2(b,c)
main( )
{ float x=3.1415,y=1.823,z=0.923;
PRINT3(x,2*y,3*z)
}
4.以下程序的输出结果是。
(1级)
# define A 3
# define B(a) ((A+1)*a)
main( )
{ int x; x=3*(A+B(7)); printf (”x=%4d\n”, x);
}
5.以下程序的输出结果是。
(1级)
# define POWER(x) ((x)*(x))
main( )
{ int i=1; while(i<=4) printf(“%d”, POWER(i++));
}
6.以下程序的输出结果是。
(1级)
main( )
{int b=5;
#define b 2
#define f(x) b*(x)
int y=3;
printf(“%d,”, f(y+1));
#undef b
printf(“%d,”, f(y+1));
#define b 3
printf(“%d\n”, f(y+1));
}
7.以下程序的输出结果是。
(2级)
#define DEBUG
main( )
{int a=14,b=15,c; c=a/b;
# ifdef DEBUG
printf(“a=%d,b=%d,”,a,b);
#endif
printf(“c=%d\n,”,c);
}a=14,b=15,c=0
8.以下程序的输出结果是。
(2级)
main( )
{int a=20,b=10,c; c=a/b;
# ifdef DEBUG
printf(“a=%d,b=%d,”,a,b);
#endif
printf(“c=%d\n,”,c);
}
四、编程题
1.编写一个宏定义MY ALPHA(c),用以判定c是否是字母字符,若是,得1;否则得0。
(2级)
2.编写一个宏定义AREA(a,b,c),用于求一个边长为a、b和c的三角形的面积。
其公式为:
s=(a+b+c)/2 area= s(s-a)(s-b)(s-c) (1级)
3.编写一个程序求三个数中最大者,要求用带参宏实现。
(1级)
4.编写一个程序求1+2+..+n之和,要求用带参宏实现。
(1级)
5.编写一个宏定义LEAPYEAR(y),用以判定年份y是否是闰年。
判定标准是:若y是4的倍数且不是100的倍数或者y是400的倍数,则y是闰年。
(1级)。