C语言宏定义

C语言宏定义#definePOLYNOMIAL(x)(3*x*x*x*x*x+2*x*x*x*x-5*x*x*x+7*x-6)为什么我用math.h里面的pow函数不行,... C语言宏定义#define POLYNOMIAL(x) (3 * x * x * x * x * x + 2 * x * x * x * x - 5 * x * x * x + 7 * x - 6)
为什么我用math.h里面的pow函数不行,报错?
比如3*pow(x,5)
展开
 我来答
GarfieldGCat
2018-05-16 · TA获得超过500个赞
知道小有建树答主
回答量:445
采纳率:92%
帮助的人:276万
展开全部

这个问题描述的不够详细。

宏定义中有一个很重要的事情就是要给参数加上括号,否则就有可能影响最终的结果。

因为宏只是简单的字符替换。

如:

#define TIME_TWO(n) (n*2)
//当你参数是单一值是,看起来无影响,比如
TIME_TWO(3)
//会被正确的替换为如下,结果为6
(3*2)
//但如果你的参数本身就是一个表达式,比如
TIME_TWO(3+2)
//那么就会被替换为如下,结果为7,不符合预期
(3+2*2)

//所以宏定义中需要包裹参数防止优先级影响结果
#define TIME_TWO_PREFECT(n) ((n)*2)
//同样调用
TIME_TWO_PREFECT(3+2)
//就会被正确的替换为如下,结果为10,符合预期
((3+2)*2)
追问
嗯,这些我都知道。我想问的这样写#define f(x) (pow(x,3))
计算x的三次方 结果始终为0。只要用pow函数就这样,我之前貌似用sqrt函数做都没出现问题
追答
不知道你的具体使用情况,但有几点要注意。一个是类型,pow出来的是double,正常情况下,你用在别的地方,理应会自动转换。但是我发现了如果直接用在printf("%d",f(n));的情况时有例外。
int a = f(n);
则不会,考虑是这种情况下的宏替换编译器无法自动帮你进行强制性的类型转换。
printf("%d",(int)f(n));
这样则可以正常使用。
仅供参考,希望对你有所帮助
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式