【问题标题】:Using printf function使用 printf 函数
【发布时间】:2011-10-16 08:24:57
【问题描述】:

当我开始在没有 C 的情况下学习 C++ 时,我从来没有费心寻找 printf。现在我想在某个项目中使用格式化输出。所以我正在寻找一些可以解释使用 printf 和 IO 流之间区别的参考资料。

我的一个疑问是:

float f = 1.5;
printf("%d", f);

为什么打印为零? FWIK 它应该将 float 重新解释为 int 是真的吗?

【问题讨论】:

    标签: c++ io


    【解决方案1】:

    它实际上调用了未定义的行为 (UB)。如果格式说明符与传递给printf 的参数的type 不匹配,则它是UB,这意味着任何事情都可能发生。它可以打印0,或9878978 或任何垃圾。任何完全不可预测的事情都可能发生。

    如果参数的数据类型是float,则使用%f

    【讨论】:

      【解决方案2】:

      当您编写 printf("%d", f); 时,f 的类型必须是 int。您编写的代码会调用未定义的行为。取自an answer to a similar question

      在同样适用于 printf 的 fprintf (7.19.6.1/9) 的文档中,它明确指出,如果任何参数不是格式说明符的正确类型 - 对于未修改的 %d,即 int - 那么行为未定义。


      为什么打印为零?

      也许他们用完了nasal demons

      【讨论】:

        【解决方案3】:

        因为%d 用于打印整数, 而不是浮点数。您需要一种浮点格式字符串,例如%f

        数据类型之间的通常转换在这里不起作用,因为printf 是一个可变参数类型的函数,您基本上可以将您想要的任何内容推送到堆栈上(或者如果您的实现不是基于堆栈的,则等效),如果它与您的格式字符串中的内容不匹配,所有赌注都已关闭 - 这是未定义的行为。

        请参阅here,了解当您出现此类不匹配时可能出错的事情之一。

        【讨论】:

          【解决方案4】:

          是的,您已经有了答案,%d 将只打印整数值。使用代表浮点值的“%f”。如果你使用%f,你会得到1.500000

          【讨论】:

            【解决方案5】:

            如果您不想使用 %d 格式说明符,那么您最好将其类型转换为 Explicitly 以避免调用 UB(Undefined Behavior)。

            浮动 f=1.5; printf("%d",(int)f);

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-30
              • 1970-01-01
              • 1970-01-01
              • 2021-05-17
              • 2017-02-20
              • 1970-01-01
              • 2021-08-20
              相关资源
              最近更新 更多