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
相关产品推荐
相关产品推荐

