答:宏定义是在编译预处理阶段被处理的。
解析:编译预处理包括:头文件包含、宏替换、条件编译、去除注释。
#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
(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++)
#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)
#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