You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:06:07