1.宏与函数的区别(选自《C和指针》285页)
(1)代码长度
1、#define :每次使用时,宏代码都被插入到程序中,除了非常小的宏之外,程序的长度将大幅度增长。
2、函数: 函数代码只出现在一个地方,每次使用这个函数时,都调用那个地方的同一代码。
(2)操 作 符 优 先 级
1、#define: 宏参数的求值是在所有周围表达式的上下文环境里,除非它们加上括号,否则邻近操作符的优先级可能会产生不可预料的后果。
2、 函数: 函数参数只在函数调用时求值一次,他的结果值传递给函数,表达式的求值结果更容易预测。
(3)参数求值
1、#define:参数每次用于宏定义时,它们都将重新求值,由于多次求值,具有副作用的参数可能会产生不可预料的后果。
2、函数:参数在被函数调用之前只求值一次,在函数中多次使用参数并不会导致都中求值过程。参数的副作用并不会造成任何特殊问题。
(4)执行速度
1、#define:更快
2、函数:存在函数调用/返回的额外开销
(5)参数类型
1、define:宏与类型无关,只要对参数的操作是合法的,它可以使用与任何参数类型。
2、函数 :函数的参数与类型有关,如果参数的类型不同,就需要使用不同的函数,即使他们执行的任务是相同的。
用宏来使一个数的奇偶位交换
#include<stdio.h>
#include<stdlib.h>
2.用宏交换两个数(用十六进制的0x5来代表二进制的0101,而0x55555555代表32位的二进制,用你输入的数和它按位与,可以使你输入的数的偶数位都为0,奇数位不变,再对求好的二级制序列向左移一位,二级制的偶数位变成了奇数为,而0xa为二级制的1010,所以(a&(0xaaaaaaaa))>>1)把输入的数的奇数为变成了偶数位,这样就可以输出的数就是要求得数。
#define COUNT(a) ((a&(0x55555555))<<1)|((a&(0xaaaaaaaa))>>1))
主函数
int main()
{
int x = 0;
printf("请输入一个数:");
scanf("%d", &x);
printf("%d\n", COUNT(x));
system("pause");
return 0;
}
3.用宏来求出两个数的较大值
#include<stdio.h>
#include<stdlib.h>
用宏来求出较大值
#define MAX(a, b) ((a > b)? a : b)
主函数
int main()
{
int x = 0;
int y = 0;
int z = 0;
int a = 0;
printf("请输入两个数:");
scanf("%d%d", &x, &y);
printf("%d\n", MAX(x,y));
system("pause");
return 0;
}
版权声明:本文为Ksaila原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。