此代码仅在我插入"%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;
}
答案 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
更容易让人理解。)