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.


参考资料

C语言宏定义

posted @ 2021-08-19 20:59  0202zc  阅读(256)  评论(0编辑  收藏  举报