2024-11-23 09:55:55
这个问题描述的不够详细。
宏定义中有一个很重要的事情就是要给参数加上括号,否则就有可能影响最终的结果。
因为宏只是简单的字符替换。
如:
#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));
这样则可以正常使用。
仅供参考,希望对你有所帮助