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

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

#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 调试

宏: 不可调试。

函数:可以调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值