编译预处理习题
一. 单项选择题
1. 在宏定义#define  A  3.897678中,宏名A代替一个(    )。
A  单精度数      B  双精度数      C  常量    D  字符串
2. 以下叙述中正确的是
A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令
C)宏名必须用大写字母表示          D)宏替换不占用程序的运行时间
3. C语言的编译系统对宏命令的处理(  )。
A  在程序运行时进行的         
B  在程序连接时进行的
C  C程序中的其它语句同时进行的
D 在对源程序中其它语句正式编译之前进行的
4. 在文件包含预处理语句的中,被包含文件名用“< >”括起时,寻被包含文件的方式是(    )。
A 直接按系统设定的标准方式搜索目录
B 先在源程序所在目录搜索,再按系统设定的标准方式搜索
C 仅仅在源程序所在目录搜索
D 仅仅搜索当前目录
5. 以下说法中正确的是
A#defineprintf都是C语句      B#defineC语句,而printf不是
CprintfC语句,但#define不是    D#defineprintf都不是C语句
6. #define  A  3.897678
#include  <stdio.h>
main(  )
{ printf(A=%f ,A);
}
程序运行结果为(    )。
A  3.897678=3.897678    B  3.897678=A  C  A=3.897678   D  无结果
7. 有宏定义:#define  LI(a,b)  a*b
      #define  LJ(a,b)  (a)*(b)
在后面的程序中有宏引用:x=LI(3+2,5+8);
                  y=LJ(3+2,5+8);
xy的值是(    )。
A  x=65,y=65    B  x=21,y=65   C  x=65,y=21    Dx=21,y=21
8. 有以下程序
# define f(x) (x*x)
main()
{ int i1, i2;
i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ;
printf("%d, %d\n",i1,i2);
}
程序运行后的输出结果是
A64, 28         B4, 4         C4, 3         D64, 64
9. 以下程序的输出结果是
#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
10. 有以下程序
#define N 5
#define M1 N*3
#define M2 N*2
main()
{ int i;
i=M1+M2; printf(%d\n,i);
}
程序编译后运行的输出结果是:
A) 10        B) 20        C) 25      D) 30
11. 有如下程序
#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
12. 位运算是对运算对象按二进制位进行操作的运算,运算的对象是____数据,以___的形式参与运算。
A) 整型  原码  B) 整型  补码    C)数值  原码  D) 数值  补码
13. 在位运算中,若左移时丢弃的高位不包含1,则每左移一位,相当于_____
  A)操作数乘以2   B)操作数除以2    C)操作数除以4    D)操作数乘以4
14. int b=8;表达式(b>>2)/(b>>1)的值是________
A) 0     B) 2      C) 4    D) 8
15. 若定义unsigned int a=3,b=10;
printf("%d\n",a<<2b==1)
则运行结果为________
A)13    B)12      C)8        D)14
二.填空题
1. C提供的预处理功能主要有__宏定义______文件包含_______条件编译__等三种。
2. C规定预处理命令必须以____#______开头。
3. 在预编译时将宏名替换成____宏定义中的“字符串”___的过程称为宏展开。
4. 预处理命令不是C语句,不必在行末加___________
5. 以头文件stdio.h为例,文件包含的两种格式为:_ # includestdio.h__# include”stdio.h”_
6. 定义宏的关键字是___define______
7. 设有如下运算符:&|~<<>>^,则按优先级由低到高的排列顺序为_~<<>>&^|______
8. 设二进制数i00101101,若通过运算“i^j”,使i的高4位取反低4位不变,则二进制数j的值应为__11110000____
9. 设无符号整型变量a6b3,则表达式b&=a的值为____2____
10. 整型变量xy的值相等且为非0值,则表达式x^y结果为________
二、阅读程序题
1. 以下程序输出结果是   150         
    # includestdio.h
    # define  MAX(xy)  (x)>(y)?(x):(y)
    main()
    {int izk
    z=15
    i=z-5
    k=10*MAXiz));
printf(“%d\n”,k);
}
2. 以下程序输出结果是   23           
    # includestdio.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)
}
3. 设有如下宏定义:
#define MYSWAP(z,x,y) {z=x;x=y;y=z;}
以下程序段通过宏调用实现变量ab内容交换,请填空。
float a=5,b=16,c;MYSWAP( c ,a,b);
4. 下列程序的输出结果是 1000  10   
#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);}
5. 以下程序输出结果是     8  20  12          
  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));
}
6. 下列程序的输出结果是 11   
#define NX 2+3
#define NY NX*NX
main()
{  int i=0,m=0;  for(;i<NY;i++)m++;  printf(%d\n,m);}
7. 下列程序的输出结果是  MIN   
#define MAX(a,b) a>b
#define EQU(a,b) a==b
#define MIN(a,b) a<b
main()运算符优先级按从高到低排列
{  int a=5,b=6;
if(MAX(a,b)) printf(MAX\n);
if(EQU(a,b)) printf(EQU\n);
  if(MIN(a,b)) printf(MIN\n);}
8. 下列程序的输出结果是 0 1 1   
#define TEST
main( )
{  int x=0,y=1,z;  z=2*x+y;
  #ifdef TEST
  printf(%d %d ,x,y);
  #endif
  printf(%d\n,z);
}
三. 编程题
1.  定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。
#define R(m,n)  (m)%(n)
#include <stdio.h>
void main()
{    int m,n;
    printf("enter two integers:\n");
    scanf("%d%d",&m,&n);
    printf("remainder=%d\n",R(m,n));
}
2.  分别用函数和带参的宏,从3个数中出最大者。
#include <stdio.h>
#define MAX(a,b)  ((a)>(b)?(a):(b))    // implementation by MACRO
int  max3(int a,int b,int c)              //implementation by function
  {int m;
m=a>b?a:b;
m=m>c?m:c;
return m;
}
void main()
{    int m,n,k;
    printf("enter 3 integer:\n");
    scanf("%d%d%d",&m,&n,&k);
    printf("1. MACRO max=%d\n",MAX(MAX(m,n),k));
    printf("2. function max=%d\n",max3(m,n,k));
}
3.  输入一个整数m,判断它能否被3整除。要求利用带参的宏实现。
#include <stdio.h>
#define DIVIDEDBY3(m)  (m)%3==0
void main()
{    int m;
    printf("enter a integer:\n");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。