使用宏定义实现乘法与加法的C代码未得到预期结果
代码运行结果为8的原因分析
先看你的代码:
#include <stdio.h> #define sum(x,y) x+y #define f(x,y) sum(x,y)*2 int main(int argc, char *argv[]) { float m=6,n=1; int x= f(m,n); printf("x is %d\n",x); }
问题出在宏的文本替换特性——宏不是函数,只会做单纯的字符串替换,不会自动保留运算优先级。
调用
f(m,n)时,宏会先展开sum(x,y),最终得到的表达式是:m+n*2
而非你预期的(m+n)*2。C语言中乘法
*的优先级高于加法+,实际计算顺序是:
先算n*2(即1*2=2),再加上m(6),最终结果为6+2=8。最后将float类型的8.0赋值给int变量x,输出结果就是8。
如果要得到预期的(6+1)*2=14,需要给宏的参数和整体加上括号,避免优先级干扰:
#define sum(x,y) (x+y) #define f(x,y) (sum(x,y)*2)
这样展开后会是((m+n)*2),运算顺序就符合预期了。
内容的提问来源于stack exchange,提问作者Rumal Gunawardana
相关产品推荐
相关产品推荐

