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

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

#define _CRT_SECURE_NO_DEPRECATE 1
#include
#include
#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张图片

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

1 代码长度

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

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

2 执行速度

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

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

3 操作符优先级

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

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

4 参数求值

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

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

5 参数类型 

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

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

6 调试

宏: 不可调试。

函数:可以调试。

你可能感兴趣的:(编程c,;c++,编程语言,用宏交换一个数的奇偶位,宏与函数的区别,宏,函数,二进制)