【问题标题】:All decimals are removed after calling a function using double使用 double 调用函数后,所有小数都将被删除
【发布时间】:2019-01-10 16:32:26
【问题描述】:

printf 正在删除我的数字的小数位。在我的情况下,6.96.4 都打印为 6.0

#include <stdio.h>
#include <stdlib.h>


int main()
{
    double Value1_m, Value2_m;
    double maximum, minimum;
    printf("Enter two decimal numbers with an space: ");
    scanf("%lf" "%lf", &Value1_m ,&Value2_m);
    //printf("%3lf", Value1_m);

    maximum = ComputeMaximum(Value1_m, Value2_m);
    minimum = ComputeMinimum(Value1_m, Value2_m);

    printf("ComputeMaximum %.10lf\n", maximum);
    printf("ComputeMinimum %.10lf", minimum);
    return 0;
}

ComputeMaximum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value1 : Value2;

}
ComputeMinimum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value2 : Value1;

}

【问题讨论】:

  • 您的函数隐式返回int。显式返回double,并在使用函数之前打开编译器警告并声明或定义函数。在整个千年中,遵循当前标准的 C 编译器无法接受您编写的代码。
  • ComputeMaximum(double Value1, double Value2) --> double ComputeMaximum(double Value1, double Value2),同样,在你的函数中使用原型或者在main之前包含它们
  • Implicit int 在当时似乎是个好主意。如果必须,请责怪 BCPL 背后的 Cantabrigian。但幸运的是,它在 1999 年从 C 标准中删除。
  • 感谢您的帮助,实施后按预期工作。
  • 制作头文件和声明。你的生活会更好。

标签: c function printf double


【解决方案1】:

您尚未为 ComputeMaximumComputeMinimum 函数声明返回类型。这在现代 C 中是错误的,您的编译器至少应该警告您。此外,您在没有范围内声明的地方调用这些函数。这也是错误的。

然而,过去如果没有类型声明的函数被隐式声明返回int,并且没有范围内声明的函数也被假定返回int。回退到该行为的编译器将接受您的程序,但这些函数的返回值将被截断为类型 int,然后在您分配值时将结果转换回 double

首先,声明函数所需的返回类型。

其次,在调用函数之前声明它们,要么将完整的定义放在首位,要么提供前向声明:

double ComputMaximum(double, double);
double ComputMinimum(double, double);

// ...

确保任何前向声明都与函数定义一致。

【讨论】:

  • 如果现在一切都在为他运行,他不一定必须声明函数。虽然你是对的,但不这样做是一个愚蠢的举动。
  • 不,@ytpillai,C99 及更高版本不支持隐式函数或变量声明。 OP 的代码在这方面不符合。此外,支持 C90 和更早版本的隐式声明的编译器将在调用点假定函数返回 int,而不是 double。这是一团糟,不太可能好转。
  • 现在,我明白你在说什么了。你是对的,我错了,我的错。只是想补充一点,OP 可能在其他地方有他们的声明并忘记粘贴它。很奇怪,他们可以在没有这些的情况下运行整个程序,除非他们正在使用 C90 或您所说的其他东西。
【解决方案2】:

Printf 不是这里的问题,问题是你的函数本身。

看看这部分

ComputeMaximum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value1 : Value2;

}
ComputeMinimum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value2 : Value1;

}

您在这些方法中没有返回类型,这意味着编译器不知道最终会返回什么。无论您使用什么都默认返回一个 int,正如您所说,这将导致删除小数点后的数字。

所以本质上,编译器会这样读取它,并添加一个默认返回类型。

int ComputeMaximum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value1 : Value2;

}
int ComputeMinimum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value2 : Value1;

}

您需要为这些方法显式添加返回类型,因此默认值不会起作用。

double ComputeMaximum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value1 : Value2;

}
double ComputeMinimum(double Value1, double Value2)
{

    return  (Value1 > Value2) ? Value2 : Value1;

}

【讨论】:

  • 并且这些函数的声明也需要在调用点的范围内。
  • 嗯。现在正在为他编译。我猜他在某处有声明。也许OP拉了一个YOLO,直接编辑了stdio头文件。
  • 现在编译时没有声明,这并不比在函数定义处使用隐式类型编译更令人惊讶。但是在纠正了后者之后,在函数调用时假定的隐式声明突然错误。这个半修复的行为可能比原来的行为更糟糕
  • 是的,我现在明白了,那是我的错,但 OP 可能在其他地方有他们的声明并忘记发布它。否则程序会给出部分正确输出的事实很奇怪。
  • 不,我认为没有理由认为 OP 在其他地方有函数声明。完全按照给定的程序编译并产生所描述的输出并不特别令人惊讶。这就是人们对 K&R C 的期望,许多编译器为此提供了向后兼容性。在调用点假定的隐式声明与后面的具有隐式返回类型的函数定义是一致的。
猜你喜欢
  • 2021-07-28
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2019-03-09
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多