C语言宏定义函数的坑
宏定义
#define 宏名 字符串
宏定义其本质就是用一个文本替换另一个文本。被替换的文本(宏名),其格式可以是数字、表达式、if 语句、函数等。因此,宏定义函数本质上就是将函数头替换为一个带参数或不带参数字符串。
宏定义函数的坑
考虑如下的一个程序:
#include<stdio.h>
#define SUM(x,y) x + y
int main() {
int a = 3, b = 2;
a += a * SUM(a,b) * b;
print("%d\n", a);
return 0;
}
之前的我一定脱口而出:3 × (3 + 2) × 2 + 3 = 33。
然而运行结果是16!
究其原因,就是 SUM(x,y)
仅仅是被替换成了 x + y
,因此 a * SUM(a,b) * b
的等同于 a * a + b * b
,即 3 × 3 + 2 × 2.
所以运行结果为 a = a + a * a + b * b,即 3 + 3 × 3 + 2 × 2 = 16.
如果是 #define SUM(x,y) (x + y)
,运行结果才是33.