在C

时间:2016-11-29 18:57:03

标签: c double

此代码仅在我插入"%d"进入最后的printf。我想这是因为" ma"是一个整数,但我希望它是一个双,我已经声明它是这样的。我该如何解决?

" V"已定义。

#include <stdio.h>
#include <stdlib.h>
#define N 25

double arithmeticMean(int v[N])
{
    double ma;
    int i,sum=0;
    for(i=0;i<N;i++){
        sum=sum+v[i];
    }
    ma=sum/N;
    return ma;
 }

int main()
{
    m1=arithmeticMean(v);
    printf("Arithmetic mean: %lf\n",m1);

    return 0;
}

1 个答案:

答案 0 :(得分:0)

因为printf接受可变数量的参数,所以编译器不知道格式字符串之后的参数是什么类型&#34;意思是&#34;成为。当你写

int m1 = arithmeticMean(v);
printf("Arithmetic mean: %lf\n", m1);

编译器将m1传递给printf 作为int 。但是%lf&#34;格式效应器&#34;期待double,它几​​乎总是与int的大小不同,并且可能完全存储在不同的地方 - 所以你得到无意义的输出。 (从技术上讲,这段代码有&#34;未定义的行为&#34;并且可能会崩溃甚至让恶魔飞出你的鼻子,但更有可能产生无意义的输出。)(另外,%lf是错误的本身,因为l修饰符不允许与f一起使用,但根据我的经验,大多数C库的行为与您编写的%f一样。)

如果你真的想强制printf打印一个int变量,就好像它是浮点数一样,你必须编写一个显式的强制转换:

printf("Arithmetic mean: %f\n", (double)m1);

或以格式字符串伪造它:

printf("Arithmetic mean: %d.0\n", m1);

但是,对于您似乎尝试编写的程序,正确的更改是将m1声明为double,而不是int,与{的返回值一致{1}}。一组整数的平均值不一定是整数。

(你真的想要强制arithmeticMean以浮点表示法打印一个整数吗?也许当它非常大时:

printf

会打印printf("%.1e\n", (double)(1000l * 1000 * 1000)); ,这比1.0e9更容易让人理解。)