用宏写一个函数交换一个数的奇偶位 并简析宏与函数调用

来源:互联网 发布:胡歌顶级时尚资源知乎 编辑:程序博客网 时间:2024/05/16 15:23

函数的目的是写一个宏,实现一个数的二进制奇偶位的交换。代码如下:

#define _CRT_SECURE_NO_DEPRECATE 1#include<stdio.h>#include<stdlib.h>#define EXCHANGE(input)\    (((input)&(0x55555555))<<1)|(((input)&(0xAAAAAAAA))>>1)int main(){int input;printf("请输入一个数: ");scanf("%d",&input);printf("奇偶位交换后:%d ",EXCHANGE(input));    system("pause");    return 0;}

程序运行后的结果


你也可以写一个函数,调用函数来实现这个功能。这二者的区别有哪些呢?接下来简要说明下

1 代码长度

宏:每次使用的时候宏的代码都会插入函数中,除非非常小的宏,不然大量重复调用必然将程序的长度增大。

函数:代码只会出现在一个地方,不会出现调用增长代码的副作用。

2 执行速度

宏:同样的代码执行速度比函数调用块

函数:会存在函数调用和返回的额外时间。(当函数执行时间远远大于调用和返回的时间时,可以将其速度等同与宏)

3 操作符优先级

宏:宏的参数求值是直接替换,附近的操作符优先级可能会引起不可预料的结果,所以在写宏的时候,不要吝啬括号,能加就加。

函数:不会因为操作符的问题引起意外的结果。

4 参数求值

宏:参数每次用于宏定义的时候都将重新求值。有副作用。

函数:参数在函数被调前只求值一次。无副作用。

5 参数类型 

宏: 与参数的类型无关,只要求参数是合法的。可以使用任何参数类型。

函数:函数的参数与类型有关,如果参数类型不同,就需要使用不同的函数,即使函数的功能完全相同。

6 调试

宏: 不可调试。

函数:可以调试。

0 0
原创粉丝点击