#define定义 简单理解

#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);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值