每当我将函数exam
中的参数i
定义为整数时,它总是打印Sum = 0.00
。
我想知道它为什么这样做…
#include <stdio.h>
#include <stdlib.h>
float exam(float i) {
if (i == 0) {
return 0;
} else {
return (i / (i + 1)) + exam(i - 1);
}
}
int main() {
int i;
printf("Enter an integer: ");
scanf("%d", &i);
printf("Sum = %.3f", exam(i));
return 0;
}
如果您将i
定义为int
,则表达式(i / (i + 1)) + exam(i - 1)
的第一部分使用整数算法求值,因此i / (i + 1)
的值为0
,并且每次递归调用都添加0
,直到i
达到0
,因此最终结果为0
。
还请注意,对于负输入,代码将具有未定义的行为,因为其中一个调用将传递-1
和i / (i + 1)
,这将导致除零,这具有未定义的行为,通常会导致程序终止。
另一个无效输入是INT_MAX
,i + 1
会导致算术溢出。
将i
定义为float
消除了这些缺点并计算出预期的结果。对于实参和返回类型使用double
而不是float
,可以提高计算的精度。