c语言——预处理&关键字(面试常考题)

问题1:宏定义是在编译的哪个阶段被处理的?

答:宏定义是在编译预处理阶段被处理的。

解析:编译预处理包括:头文件包含、宏替换、条件编译、去除注释。

1、#define定义标识符

#define 定义宏可分为两种

           1)一种是不带参数的宏定义,其定义格式如下 

#define  宏名   宏的内容

例子

#define    MAX      100                   解读:MAX就是100                     

#include 

#define MAX  100
int main()
{

   printf(" MAX= %d\n",MAX);
   
   return 0;
}

运行结果

MAX= 100

               2)第二种是带参数的宏定义,其定义格式如下 

#define  宏名(参数)   宏的内容

例子

#define    ADD( a + b )      a  +  b                 

  // 解读:定义了一个名为ADD的宏 ,宏的参数有两个 a 和 b,这个宏所要实现的功能是将 a 和 b 相加

#include 

#define  ADD(a,b)   a+b

int main()
{
   int a=50;
   int b=100;
   int sum1;
   
   int c = 5;
   int d = 10; 
   int sum2;
   
   sum1 = ADD(a,b);
   sum2 = ADD(c,d);
   
   printf(" sum1= %d\n",sum1);
   printf(" sum2= %d\n",sum2);
   return 0;
}

 运行结果

 sum1= 150
 sum2= 15

  停。你是否发现带参数的宏,很像我们的函数传参

#include 

int  Additive_function(int a, int b) 
{
   int sum; 
   sum = a+b;
 
  return sum;
}
 
int main()
{
   int a=50;
   int b=100;
   int sum1;
   
   int c = 5;
   int d = 10; 
   int sum2;
   
   sum1=Additive_function(a,b);
   sum2=Additive_function(c,d);
 
   printf(" sum1= %d\n",sum1);
   printf(" sum2= %d\n",sum2);
   return 0;
}

 运行结果

 sum1= 150
 sum2= 15

 问题2:带参宏和函数的区别?

(1)带参宏只是在编译预处理阶段进行简单的字符替换;而函数则是在运行时进行调用和返回。

(2)宏替换不占运行时间,只占编译时间;而函数调用则占运行时间(分配单元、值传递、返回)。

(3)带参宏在处理时不分配内存;而函数调用会分配临时内存。

(4)宏不存在类型问题,宏名无类型,它的参数也是无类型的;而函数中的实参和形参都要定义类型,二者的类型要求一致。

(5)而使用宏定义次数多时,宏替换后源程序会变长;而函数调用不使源程序变长。

 

面试题型精选 

(1)易错的题型(简单型)

#include 

#define  A  5+5

#define  B  (5+5)
int main()
{
   
   
   printf(" 5*A= %d\n",5*A);  // 5*A,并不是你想的5*10=50;正确的是 5*5+5=30
   
   printf(" 5*B= %d\n",5*B);  //此句,才表达的是5*(5+5)=50
   return 0;
}

运行结果

 5*A= 30
 5*B= 50

  (2)易错的题型(中等偏下型)

#include 

#define  MU(x)  x*x

int main()
{
   
  printf(" MU(5)= %d\n",MU(5));     // 答案:25,没问题,正确的。即  5*5=25,那么下面这道呢?
  

//有的人一下就说出来81,答案真的是这样??,我们还原式子。即  5+4 * 5+4 = 29 ,你学会了?? 
  printf(" MU(5+4)= %d\n",MU(5+4));
   return 0;
}

运行结果

 MU(5)= 25
 MU(5+4)= 29

 (3)易错的题型(中等型)

#include 

#define  MAXA    5+10
#define  MAXB   (5+10)
#define  MU(x)   x * x

int main()
{
   
  printf("MU(MAXA)=%d\n",MU(MAXA));         //即 5+10 * 5+10  = 65   
  
  printf("MU(MAXB)=%d\n",MU(MAXB));         //即 (5+10) * (5+10)  = 225 
    
  printf("5 * MU(MAXA)=%d\n",5 * MU(MAXA)); //即  5*5 +10 * 5+10  =85
 
  printf("5*MU(MAXB)=%d\n",5*MU(MAXB));     //即  5*(5+10)*(5+10) =1125
 
   return 0;
}

 运行结果

MU(MAXA)=65
MU(MAXB)=225
5 * MU(MAXA)=85
5*MU(MAXB)=1125

 (4)易错的题型(面试重点考察a++)

c语言——预处理&关键字(面试常考题)_第1张图片

 

#include 
//此语句,A和B判断,如果A是小于或者等与B,返回A,否则返回B
#define  MIN(A, B)  ((A)<(B)? (A):(B)) 


int main()
{
  int k =1;	
  int a =1;
  int b = 2; 

  printf("补充知识,演示\n");	
  printf("%d\n",k++);  //答案:1 ,先执行完这句 printf("%d\n",k++);后加1 。即k=2
  printf("%d\n",k);    //答案:2


  printf("*******进入正题***********\n");

  printf("%d\n",MIN(a, b));   // 1<2 返回1
  

  printf("%d\n",MIN(a++, b++)); // 重点代码
 //替换代码
 // printf("%d\n",((a++)<(b++)? (a++):(b++)));
  	 	

  printf("*******执行完宏之后***********\n");	
  printf("a=%d, b=%d\n",a,b); 

   return 0;
}

运行结果

补充知识,演示
1
2
*******进入正题***********
1
2
*******执行完宏之后***********
a=3, b=3

 (5)易错的题型(面试重点考察++a)

c语言——预处理&关键字(面试常考题)_第2张图片

#include 

//此语句,A和B判断,如果A是小于或者等与B,返回A,否则返回B

#define  MIN(A, B)  ((A)<(B)? (A):(B)) 


int main()
{
  int k =1;	
  int a =1;
  int b = 2; 
  printf("补充知识,演示\n");	
  printf("%d\n",++k);  //答案:2 ,先执行k++,即k=2,再结束此语句
  printf("%d\n",k);    //答案:2
  printf("*******进入正题***********\n");

  printf("%d\n",MIN(a, b));   // 1<2 返回1
  
  printf("%d\n",MIN(++a, ++b));  //重点代码
 //替换代码
 // printf("%d\n",((++a)<(++b)? (++a):(++b)));
  	 	
  printf("*******执行完宏之后***********\n");	
  printf("a=%d, b=%d\n",a,b); 

   return 0;
}

运行结果

补充知识,演示
2
2
*******进入正题***********
1
3
*******执行完宏之后***********
a=3, b=3

 

          

你可能感兴趣的:(面试题,c语言)