yihayoooooo 发表于 2020-7-6 15:09:28

宏定义

#define f(x)x*x
main()
{
    int a=6, b=2, c;
    c=f(a)/f(b);
    printf("%d \n", c);
   
}



为什么输出结果是36不是9?
谢谢

永恒的蓝色梦想 发表于 2020-7-6 15:12:16

又一个被宏害了的……
把宏改成#define f(x) ((x)*(x))就可以了。

永恒的蓝色梦想 发表于 2020-7-6 15:14:11

至于原因嘛,宏真的就只是替换,你的代码替换过后就变成了:#define f(x)x*x
main()
{
    int a=6, b=2, c;
    c=a*a/b*b;
    printf("%d \n", c);
   
}而你想要的是#define f(x)x*x
main()
{
    int a=6, b=2, c;
    c=(a*a)/(b*b);
    printf("%d \n", c);
   
}运算顺序不同了,结果就不同了。

永恒的蓝色梦想 发表于 2020-7-6 15:14:31

如果有条件用 C++ 编译器的话,建议用 inline 或 constexpr 函数。

永恒的蓝色梦想 发表于 2020-7-6 15:21:43

给个最佳吧{:10_266:}答题不易啊{:10_266:}

小鲸鱼666 发表于 2020-7-6 15:54:15

你加上的宏定义运算顺序就是6*6/2*2=36;(左往右运算)
你在x*x两边加上括号就好了

CodingCat_k 发表于 2020-7-6 16:45:08

宏定义本质就是文本替换,你的f(x)会被替换成x*x,
所以你连起来运算的时候也就出现了结果不理解(即为a*a/b*b 而并非期待的 (a*a)/(b*b)),
另外建议学习一下DEBUG,遇到不理解的自己一步一步的去调试。

liuzhengyuan 发表于 2020-7-6 18:48:01

https://s1.ax1x.com/2020/07/05/UpAthV.gif
页: [1]
查看完整版本: 宏定义