#define定义 简单理解
程序员文章站
2022-03-15 19:44:51
...
#define定义 标识符
语法: #define name stuff
例如: #define MAX 1000
意思是定义了一个值为1000的MAX
例如: #define reg register
为register这个关键词起了一个更短的名字
#define定义 宏
语法:#define name(一个或者多个逗号隔开参数) stuff
例如:#define MAX(a,b)((a)>(b)?(a):(b))
定义了一个名为MAX的宏,功能为取两个数中的较大数
注意:用于对数值表达式进行值的宏定义都应该加上括号,避免在用宏时由于参数中的操作符或者邻近的操作符之间不可预料的相互作用
看到这里,肯定会有人想,定义的宏和函数有什么区别呢?写法和功能上和函数没什么两样啊,下面就来比较一下宏和函数的区别。
属性 | define宏 | 函数 |
---|---|---|
代码长度 | 每次使用宏时,宏代码都没插入到子程序中,除了非常小的宏之外,程序的长度将大幅度增长 | 函数代码只出现于一个地方,每次使用此函数时,都在同一个地方地方调用 |
执行速度 | 更快 | 存在函数调用/返回的额外开销 |
操作符优先级 | 宏参数的求值是在所有的周围表达式的上下文环境中,除非他们加上括号,否则相邻操作符的优先级可能会产生不可预料的结果 | 函数参数只在函数调用时求值一次,它的结果值传递给函数,表达式的求职结果更容易预测 |
参数求值 | 参数每次用于宏定义时,都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预测的结果 | 参数在函数被调用时只求值一次,在函数中多次使用参数并不会导致多种求值过程,参数的副作用不会造成任何特殊的问题 |
参数类型 | 宏与类型无关,只要对参数的操作是合法的,他可以使用任何参数类型 | 函数的参数是与类型有关的,参数类型不同,就需要不同的函数,即使执行的任务是相同的 |
宏定义代码示例
1.将一个数字的奇数位和偶数位交换
#include<stdio.h>
#define EX(num)\
((((num)&(0x55555555)) << 1) | (((num)&(0xaaaaaaaa)) >> 1))
//取出奇数位将偶数位清零 将偶数位取出来奇数位清零
int main()
{
int num = 0;
printf("请输入数字: \n");
scanf("%d", &num);
printf("%d", EX(num));
return 0;
}
2.使用宏实现两个数中求较大值
#include<stdio.h>
#define MAX(x,y)\
((x) > (y) ? (x) : (y))
int main()
{
int a = 0;
int b = 0;
printf("请输入要比较的两个数: \n");
scanf("%d%d", &a, &b);
}
下一篇: 散列的基本介绍