宏预处理指令(Macro preprocessor directive):编译器源码替换为何输出y is 392?
宏预处理如何得到输出“y is 392”?
嘿,这个问题刚好戳中宏预处理最容易踩坑的点——纯文本替换的规则!咱们结合常见的代码场景一步步拆解:
首先,能得到这个结果的代码大概率是这样的:
#include <stdio.h> #define MULTIPLY(a, b) (a) * (b) // 注意宏参数外的括号 int main() { int y = MULTIPLY(5 + 2, 56); printf("y is %d", y); return 0; }
接下来看编译器预处理阶段的源码替换操作:
- 第一步:预处理程序识别到宏调用
MULTIPLY(5 + 2, 56),匹配到对应的宏定义#define MULTIPLY(a, b) (a) * (b) - 第二步:执行纯文本替换——把宏定义里的参数
a直接替换成5+2,b直接替换成56,不会提前计算表达式的值。替换后,赋值语句变成:int y = (5 + 2) * (56); - 第三步:预处理完成后,替换后的代码进入编译阶段,表达式按照运算符优先级计算:
(5+2)等于7,7乘以56得到392
这里必须划重点:宏参数外的括号是关键!如果宏定义写成#define MULTIPLY(a, b) a * b,替换后会变成5 + 2 * 56,按照乘法优先的规则,先算2*56=112,再加5得到117,就出不来392的结果了。
内容的提问来源于stack exchange,提问作者Amam Prakash
相关产品推荐
相关产品推荐

