宏定义浅谈 用宏定义交换数的奇偶位 用宏定义找出两个数最大值

来源:互联网 发布:数据分析师教材 编辑:程序博客网 时间:2024/05/27 14:13

1.什么是宏定义:宏定义是C语言提供的三种预处理其中的一种,这三种定义包含:宏定义、文件包含。条件编译,宏定义是对于文本进行替换,比如:

#define MAX 1000  则这里就是用1000替换MAX  ,需要强调的是,宏定义不做文件的检查,即不做类型的判断。

2.定义宏函数:还是举例子说明:#define SQUARE(x) x*x   若在上述声明后把x设为5;则预处理器就会用5*5来替换上述x;这里需要强调括号的问题,假若printf(“%d\n”,SQUARE(x+1)),这里最终输出的值为11而不是36,应为预处理先将X变为了10,最后输出相当于10+1=11。总之宏是替换。

例1:

用宏定义找出两个数最大值

#define MAX(a,b) ((a)>(b)?(a):(b))

例2:

用宏定义交换一个数的奇偶位

分析一下:简单来说就是将第0位和第1位交换,第二位和第三位交换,以此类推,我们需要将奇数位和偶数位找出来,(x&0x55555555)>>1得到奇数位与原来相同但偶数位为0的二进制数,(x&0xAAAAAAAA)>>1得到偶数位与原来相同但奇数位为0的二进制数;最终两个二进制数按位或就得到结果。

#define SWAP(x)\

((x&0x55555555)>>1|(x&0xAAAAAAAA)>>1)

3.#和##:其中#是把一个宏参数变成对应的字符串,比如:

int i=10;

#define PRINT(FORMAT, VAULE)\ //最后的'\'是续行作用。

printf(“the vaule of "#VAULE”is"FORMAT"\n",VAULE);

.....

printf(“%d”,i+5);  在这部分代码中#VAULE会被预处理为VAULE ,最终会得到the vaule of i+3 is 13。

那对于##,它可以把两边的符号合成一个符号,需要强调的是 最终必须产生一个合法的标识符。

4.宏的优缺点:宏的速度快,宏与类型无关,但除非宏比较短,否则会大大增加程序的长度,而且宏没法调试,其次宏不够严谨。



阅读全文
0 0