【问题标题】:C program gives unexpected outputC 程序给出了意外的输出
【发布时间】:2016-03-11 09:09:38
【问题描述】:

这是我的 C 程序:

#include <stdio.h>
main(){ printf("%f", 5/3); }

我希望输出为1.000000,但我得到的输出是0.000000。谁能解释一下原因?

【问题讨论】:

  • 您在构建时看到一些警告吗?
  • @purplepsycho:可能不会。没有返回类型的main() 表示他没有使用C99 或C11,尽管缺少return 0; 会导致未定义的值作为退出状态返回给环境。如果编译器没有对此类问题发出警告,则不会对格式不匹配发出警告。他需要打开更多警告或获得更好的编译器——可能是后者。
  • @JonathanLeffler 我猜在 C 中,函数的默认返回类型是 int,而 return 0; 是隐式的,所以不需要它。顺便谢谢!
  • 只有非常老的 C (C89/C90) 的默认返回类型为int; C99 和 C11 都需要明确的返回类型。因此,如果你省略了int,那么你一定是在使用非常古老的C。但是,非常古老的C没有main()末尾的隐含return 0;;由 C99 添加。因此,您的代码在非常古老的 C 语言中存在缺陷,因为它应该显式地从 main() 返回一个值。你不能同时拥有这两种方式。现在,您使用的编译器是否会注意到和抱怨是一个单独的问题。您可能没有使用触发它们的警告选项。

标签: c floating-point integer printf rounding


【解决方案1】:

您使用了错误的格式说明符。 5/3 的结果是 int(整数),这是您传递给 printf() 的结果。在您的格式中,您使用%f 修饰符,这意味着float。使用错误的 printf() 修饰符是未定义的行为,这意味着这可以做任何事情,比如在你的情况下显示 0。

要解决它,将除法的结果转换为float,如下所示:

printf("%f",(float)(5/3));

这将按预期打印 1.0。

记住你也可以输入,例如:

printf("%lf", 5./3);

为了将 5 转换为包含 5 的 double 类型的浮点值。请注意,您随后将执行浮点除法,因此结果将是 1.3333。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    相关资源
    最近更新 更多