在C语言中编写函数时返回一个浮点值

3

我正在编写一个简单的c语言函数,用于返回两个浮点值的中间值。

我的函数如下:

float mid(float a, float b) {
      return (a + b)*0.5; 
}

问题在于这个函数总是会产生0.000000。我通过以下方式进行检查:
printf("%f", mid(2,5))

这将会打印出 0.000000。

然而,如果我只是这样做:

printf("%f", (2+5)*0.5) 

这将打印出3.5,这是正确的。

我该如何解决这个问题?


你能发布完整的代码吗?这个函数是在同一个CU中定义的吗? - tristan
2
请更新您的问题,以展示一个完整的自包含程序来展示问题所在。阅读以下内容:http://sscce.org/。您的函数看起来没问题。我有一个关于问题可能是什么的直觉,但需要一个自包含程序才能搞清楚。 - Keith Thompson
1
运行良好!我运行了程序并打印出了3.5。也许再加些代码会有所帮助。还可以尝试这个:printf("%f", mid(2.0, 5.0)); - Rizier123
3
如果在编译代码时出现任何警告,请在问题中包含这些警告。 - Keith Thompson
2个回答

10

这个函数没问题。例如,这个小片段输出正确。

#include <stdio.h>
#include <string.h>

float mid(float a, float b);     //declaration here

int main(void)
{
    printf("%f\n", mid(2,5));
    return 0;
}
float mid(float a, float b) {
      return (a + b)*0.5;
}
你可能遇到的问题是你没有像我一样添加mid()的声明,编译器认为它返回隐式的int,这导致了问题。

+1 你很可能添加"...并忽略了关于mid函数的隐式声明返回int"或类似语言到那些症状列表中。 - WhozCraig
@Will:在现代 C 语言(ISO C99 及以后版本)中,返回值不会默认为 int - Keith Thompson
C99标准的草案是N1256。前言提到了删除隐式int规则。2011年标准的草案是N1570 - Keith Thompson
如果你在main函数或者第一次使用该函数之前声明了函数,那么你就不需要原型。 - phuclv
@LưuVĩnhPhúc:函数定义提供了一个声明,这个声明本身就是一个原型(假设它指定了参数类型)。 - Keith Thompson

2

这应该可以工作!但我建议您显式传递双精度值。

#include <stdio.h>
float mid(float a, float b);

int main() {

    printf("%f", mid(2.0, 5.0));

    return(0);

}

float mid(float a, float b) {
      return (a + b)*0.5; 
}

1
只是提醒一下,你传递的不是浮点数,而是双精度浮点数。 - Bill Lynch
1
@sharth 同意,但是任何合理的程序员都会在编译时将 2.0, 5.0 转换为 2.0f, 5.0f。如果代码写成了 mid(2.0f, 5.0f),不会期望有任何生成的代码差异。是的,mid() 的结果可能会被转换为 double,传递给 printf(),然后为了打印目的而转换为 float。一些编译器确实会检查常量格式,并且可以跳过 mid() 结果 --> double --> print float,直接执行 mid() 结果 --> print float - chux - Reinstate Monica
@chux:原始答案建议将变量作为浮点数传递是“更好的”。我指出Rizier实际上没有遵循他们自己的建议。话虽如此,我大多数时候都同意。我期望任何合理的编译器都会将整个代码转换为:printf("%f",3.5f); - Bill Lynch
一个旁注:在嵌入式领域,编译器会检查常量格式,因此只实现所需的转换而不是整个 printf()。我想知道是否可以简化为 fputs("3.500000", stdout);。嗯…… - chux - Reinstate Monica
为什么你建议将双精度数传递给一个接受单精度数的函数? - M.M
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接