(2018.4.8)宏与函数的区别

  • Post author:
  • Post category:其他


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 版权协议,转载请附上原文出处链接和本声明。