gpt4 book ai didi

c - 函数参数接收一个 int "b"数字但打印一个随机数(函数调用函数)

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:49 24 4
gpt4 key购买 nike

我确实在下面的代码中评论了问题所在,当调用 pow 函数时,exp 参数变得疯狂。该代码的目标是接收用户输入并求解该表达式 x/(1+t)^n。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

float val();
float pow();

float val(float x, int n, float t) {

float res = 0;

for (int i = 0; i < n; i++) {
printf("exp = %d\n", i+1); // real value exp start equals 1
res += x / pow(1 + t, i+1);
}
return res;
}

float pow(float base, int exp) {
int i = 0;
float res = 1;
printf("exp = %d", exp); // here starts the problem
if (exp == 1) {
return base;

}
while (i < exp) {
res *= base;
i++;
printf("i = %d\n", i);
printf("exp = %d\n", exp);
getchar();
}
return res;
}

main() {
int n;
float x, t, res;

printf("type x,n,t\n");
scanf("%f %d %f", &x, &n, &t);
res = val(x, n, t);
printf("VAL = %f\n", res);


}

输出:

type x,n,t
6
2
2
exp = 1
exp = 1074266112i = 1
exp = 1074266112
i = 2
exp = 1074266112

发生了什么事伙计们?感谢您的关注:)

最佳答案

不要使用旧式的已弃用的非原型(prototype)前向声明:

float val();    /* This syntax should never be used */
float pow();

当你声明一个函数时,声明它的完整原型(prototype):

float val(float x, int n, float t);
float pow(float base, int exp);

此外,请考虑使用 double 而不是 float


从最初的结果可以猜到,您的程序表现出未定义的行为;在这种情况下,您使用与其参数类型不兼容的参数类型调用 pow。旧式弃用声明样式

float pow();

没有指定 pow 的参数类型是什么,甚至没有指定它期望的参数类型。实际上,它告诉编译器“相信我,我会提供正确类型的参数。”

但是这样就不可能遵守这个 promise ,因为 pow 需要一个 float 作为它的第一个参数,并且编译器对提供的所有参数执行默认参数提升到没有原型(prototype)声明的函数。其中一个默认促销将 float 转换为 double,因此不可能提供 float 参数。如果您使用 double 而不是 float,您就不会遇到这个特殊问题,并且您可能会继续使用近 30 年来一直不鼓励使用的语法.

顺便说一下,val 中没有出现这个问题,因为 val 的定义发生在你使用它之前。当然,该定义确实指定了参数类型,并且填充了无原型(prototype)前向声明中省略的信息。

但底线是上面提供的简单建议:不要使用旧式函数声明。每个函数都应该声明一个完整的原型(prototype),指定其所有参数的类型。 (如果您需要声明一个没有参数的函数,请使用特殊参数列表 (void) 而不是空参数列表。)

关于c - 函数参数接收一个 int "b"数字但打印一个随机数(函数调用函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50425329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com