【问题标题】:Why the returning from a double function becomes int?为什么从 double 函数的返回变成 int?
【发布时间】:2016-04-28 02:21:29
【问题描述】:

我有一个这样的双重功能:

double f(){
     double value=0.1234;
     return value;
}

在另一个函数中,我收到了值并打印了它。

printf("%f",f());

我想查看打印的值 0.1234,但打印的是 0。 如果我这样转换类型:

printf("%f",(double)f());

会打印一个非常奇怪的值,例如 -147923499.34。

经过一番检查(print sizeof)我发现f()的返回值是4字节,而double类型应该是8字节。

那么,这其中的根本原因是什么?如何从函数中返回正确的双精度值?

【问题讨论】:

  • Seems to work fine。请发布一个最小的可编译程序来演示您的错误。
  • 也许你在调用f()时没有原型在范围内
  • @Alfie:优先级不是这样工作的,如果是这样,至少有两个原因不会编译。
  • 是 C 还是 C++?你有两个标签,但它们是不同的语言。
  • C is not C++,而这个问题正是存在差异的原因。如果不对函数进行原型设计,您的代码将无法在 C++ 中编译。在 C (C89) 中,该代码可以正常编译,但会产生不良影响,就像函数在实际返回双精度时返回 int 一样。所以不要将问题标记为 C 和 C++。相反,请选择您实际使用的语言并将该标签应用于您的问题。

标签: c int double


【解决方案1】:

听起来你在没有原型的情况下调用了f()。在 C89 中,编译器对此作出反应,假设 f 返回 int。如果f 的实现实际上并未返回int,则行为未定义。

在 C++ 中,以及自 C99 起的 C 中,至少必须为此代码提供警告。检查您的编译器输出,我建议您注意任何警告消息,如果没有,请调高警告级别。

要修复代码,请编写原型:

double f(void);

在调用函数之前。将原型放在一个头文件中是正常的,该头文件包含在调用函数的代码和实现函数的代码中。然后编译器会检测到调用和实现之间的不匹配。

【讨论】:

  • 我在头文件中声明原型后问题解决了。我已经删除了问题的 C++ 标签。
  • @Akr 酷。我建议确保您收到未修复代码版本的编译器警告,以防您在程序的其他地方遇到类似的错误
  • 谢谢。这对 C89 来说是一件非常有趣的事情。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2018-04-17
  • 2012-10-24
  • 2019-09-10
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多