Double在递归时返回0,但在int时工作正常

时间:2012-09-02 10:30:02

标签: c recursion double

如果您将所有double更改为int

,我不明白为什么它可以正常工作

我的printf语句有问题吗?

您对%f使用%lfdouble,对吧?

/*
double power(double a, int b) that calculates the power ab. You are allowed to use the
multiplication operator *.
*/
#include <stdio.h>
#include <conio.h>
double power(double a,int b)
{
    double buffer;
    if(b > 1)
    {
        buffer = a * power(a,b-1);
        return buffer;
    }
    else
        return a;
}
int main(void)
{
    double a;
    int b;
    int buffer;
    scanf("%f",&a);
    scanf("%d",&b);
    buffer = power(a,b);
    printf("%f",buffer);
    getch();
}

4 个答案:

答案 0 :(得分:1)

int buffer;
printf("%f",buffer);

你在printf中使用了错误的说明符,这是一个严重的问题,因为printf无法转换参数。使用%d或将buffer更改为双精度。


作为第二个问题,您还希望在%lf中使用%f代替scanf,因为adouble,而不是float {{1}}。

答案 1 :(得分:0)

scanf("%f",&a);

您需要按%lf阅读双倍内容。请参阅this question,了解%lf scanfprintf {{1}}但不是{{1}}的原因。

答案 2 :(得分:0)

问题是,在您的系统上,int似乎与float的长度相同,但不是double - 当您扫描f()一个双倍时,您松散了一半它(顺便说一句,为scanf提供错误的格式说明符是未定义的行为)。您必须使用%lf进行双打。

答案 3 :(得分:0)

你应该在扫描时使用%lf加倍{f}请参阅this问题 取代:

scanf("%f",&a);

使用它:

scanf("%lf",&a);

同样在main函数中,缓冲区的类型应为double而不是int