C语言 为什么使用int代替float作为参数给我一个错误的结果



每当我将函数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

还请注意,对于负输入,代码将具有未定义的行为,因为其中一个调用将传递-1i / (i + 1),这将导致除零,这具有未定义的行为,通常会导致程序终止。

另一个无效输入是INT_MAX,i + 1会导致算术溢出。

i定义为float消除了这些缺点并计算出预期的结果。对于实参和返回类型使用double而不是float,可以提高计算的精度。

最新更新