#define定义的宏 | 函数 | |
代码长度 | 每次使用时,宏代码都会插入程序中,造成代码长度更长 | 只出现一次,需要时调用它 |
运行速度 | 更快(对于小型计算工资) | 存在函数的调用和销毁 的另外开销 |
操作符优先级 | 由于宏是进行替换,临近操作符 可能会出现危险,所以在使用时多加括号(具体请看我上一篇文章) |
函数参数只在函数调用的时候求 值一次,它的结果值传递给函 数。
表达式的求值结果更容易预测
|
带有副作用的参数 | 当参数有副作用时,宏容易出现 危险(后面有详解) | 函数参数只在传参时求值一次, 结果更容易控制 |
参数类型 | 无要求 | 函数参数和类型有关 |
调试 | 没有 | 可以 |
递归 | 不可 | 可以 |
带副作用的宏参数
例如:x+1没有副作用
x++有副作用
#include<stdio.h>
#define MAX(a,b)((a)>(b)?(a):(b))
int main()
{
int a = 5;
int b = 8;
int c = MAX(a++, b++);
printf("a=%d b=%d c=%d", a, b, c);
}
答案:(a++)>(b++)?(a++):(b++)
先比较(5++)>(8++)
后置++,先使用后++所以8>5
此时a=6,b=9
(a++)不计算
(b++)得b=10,c=9(后置++)
所以a=6,b=10,c=9