#include<stdio.h>
double sum_1(int n)
{
int i=1;
double s;
while(n>0)
{
s=s+i/(2*i+2);
i=i+2;
n--;
}
return s;
}
int main()
{
int n=5;
double s1;
printf("Enter n:n");
scanf("%d",&n);
s1= sum_1(n);
printf("sum = %lf",s1);
return 0;
}
问题是
s=s+i/(2*i+2);
在第一次迭代中,未初始化地使用s
。由于这是一个可以具有陷阱表示的类型,并且它的地址永远不会被占用,因此尝试在这里使用未初始化的值会调用未定义的行为。
也就是说,声明的分组
s=s+i/(2*i+2);
与相同
s = s + ( i / (2*i+2) );
^^^^^^^^^^^^^---- integer division
所以,它涉及整数除法,这很可能是你不想要的。您需要强制执行浮点运算,如
s=s+i/(float)(2*i+2);
最后,对于打印double
,%f
是足够的,不需要%lf
并且没有效果。