1.不带参数的宏定义
#define PI 3.14
将文中的所有的PI替换为3.14
#define PI 3.1415926
float radius = 2.0;
float area = PI * radius * radius;
#define PI 3.1415926
float radius = 2.0;
#undef PI // 这时就会报错,宏定义终止了。
float area = PI * radius * radius;
宏定义的嵌套
#define PI 3.1415926
#define R 6
#define S = PI * R * R
int mian()
{
printf("%d",S) ;
}
2.带参数的宏定义
==宏定义仅仅是替换==
#define MAX(x,y) (((x) > (y)) ? (x) : (y))
int main(void)
{
int x, y ;
printf("输入两个整数\n");
scanf("%d%d",&x,&y) ;
printf("%d 是较大的那个数\n",MAX(x,y)) ;
}
这样看,宏定义与函数看着有点相似,但是不同
- 宏定义只是机械的替换,不需要定义参数的类型
- 函数的参数不同,是形参和实参,通过栈进行传输的。变量,需要指定类型。
==注意== 在使用带参数的宏定义时,定义的时候就要按照顺序加括号,不然会因为优先级的问题而出错。
要牢记宏定义只是替换,跟函数是不一样的。
案例:
#define SQUARE(x) ((x) *(x))
int square(int x)
{
return x*x ;
}
int main(void)
{
int i = 1 ;
while(i <= 100)
{
printf("%d的平方是%d\n",i-1,square(i++)) ; //使用函数计算的结果是正常的
// 执行顺序是从右到左的。
printf("%d的平方是%d\n",i-1,SQUARE(i++)) ; // 使用宏定义,结果是错误的。
}
}
宏定义的错误结果:
因为宏定义的SQUARE
相当于
((i++)*(i++)) 加了两次,所以结果是错误的