我最初有一个使用pow()的函数,我注意到它每次都返回零值.在调试时,我发现这似乎是问题的根源:
#include <math.h>
#include <stdio.h>
#include <string.h>
int foo(int n)
{
printf("%d is number passed in \n", n);
double base = (double) n;
printf("%d is base \n", base);
printf("%d is power\n", pow(base ,2));
return (1/2 *( pow( (double) n, 2)));
}
Run Code Online (Sandbox Code Playgroud)
如果我在任何整数值(例如8)上调用foo ,则第二个printf语句每次都打印为零.(当然,第三个也是如此).不应该将double转换为int直接吗?
你有几件事情错了.
首先,你正在使用说明%d符printf,但你传递给它一个double值; 对于doubles,你应该使用%f1,否则printf会尝试将字节解释double为a int,导致意外结果(在你的情况下为0).
请注意,最近的编译器通常会注意到这种错误,警告级别足够高.
而且,在你写的return语句中
1/2 *( pow( (double) n, 2))
Run Code Online (Sandbox Code Playgroud)
由于该1/2因子,该表达式将始终为零.两个1和2是intS,因此执行整数除法,显然它导致0,杀死整个表达式.
解决方案:将1/2to 更改为1/2.(其中2.表示2作为double值,将操作提升为浮点除法),或者简单地将其替换为0.5,或者(甚至更简单)在表达式的末尾执行除法.
%f是为了float什么,还有其他东西用于doubles; 相反,事实证明floats 没有说明符,因为它们在double作为"变量参数"传递给函数时自动转换为s(所以这适用于printf).