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

C语言宏定义疑问:product(i+1)计算结果为何与预期不符?

为什么C语言宏的计算结果和预期不符?

先看你第一段代码的问题:
C语言的宏是纯文本替换,不是函数调用。你定义的#define product(x) (x*x),当调用product(i+1)时,宏会直接把x替换成i+1,展开后的代码是:

j = (i+1*i+1);

因为乘法优先级比加法高,所以先计算1*i(也就是3),然后按顺序算3+3+1,结果就是7,不是你预期的16。

再看第二段代码:
宏#define product(x) (x*x*x)展开后是:

j = (i+1*i+1*i+1);

同样按优先级计算,1*i等于3,两个1*i就是3+3,再加上原来的i(3)和最后的1,总和是3+3+3+1=10,这就是结果为10的原因。

正确的宏写法

要避免这种优先级问题,必须给宏参数和整个表达式都加上括号,确保替换后的运算顺序符合预期:

// 计算平方的正确宏
#define product(x) ((x)*(x))
// 计算立方的正确宏
#define product(x) ((x)*(x)*(x))

这样调用product(i+1)时,展开后会是((i+1)*(i+1)),乘法会先计算括号里的i+1,得到44=16;立方的话就是((i+1)*(i+1)*(i+1))=44*4=64,和预期一致。

内容的提问来源于stack exchange,提问作者Epsilon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:10:31