C语言使用#define定义SQRT宏后16/SQRT(4)结果为16的原因
问题原因
C语言的#define宏是编译期纯文本替换,不会做任何语法层面的运算优先级处理,你的代码在预处理阶段会完成如下替换:
- 原表达式:
16 / SQRT(4) - 宏展开后:
16 / 4 * 4
C语言中乘号*和除号/属于同一优先级,且运算规则为左结合,所以实际运算顺序是(16 / 4) * 4 = 4 * 4 = 16,和你预期的16 / (4*4) = 1结果不符。
修复方案
定义带参数的宏时,一定要给参数和整体表达式都加上括号,避免优先级问题:
#include <stdio.h> // 正确的宏定义写法:参数和整体都加括号 #define SQRT(X) ((X)*(X)) int main(){ int x=16/SQRT(4); printf("%d",x); return 0; }
修改后宏展开的表达式为16 / ((4)*(4)),运算结果就符合预期了。
内容的提问来源于stack exchange,提问作者Ashan Tharaka
相关产品推荐
相关产品推荐

