【问题标题】:Is passing a float to printf undefined behavior?是否将浮点数传递给 printf 未定义的行为?
【发布时间】:2014-12-15 23:37:07
【问题描述】:

C99 标准在 fprintf(随后适用于 printf)的规范中谈到了 double。它说“代表浮点数的 double 参数被转换......”然后在第 9 段中,它说:

如果转换规范无效,则行为未定义。 如果任何参数不是对应的正确类型 规范,行为未定义。

所以我希望以下是未定义的行为,但我的编译器没有警告它。

double d = 2.0;
float f = 2.0f;
printf("%f", d);
printf("%f", f); // here

另一方面,fscanf 的规范说“浮点数”而不是双精度数。是像this user 声称的未定义行为吗?

【问题讨论】:

  • C 中的浮点数会自动提升为 double,这就是规范讨论双精度而不是 float 的原因
  • 我认为从float 到double 的类型转换有一个“转换规范”,因此使printf 期望double 但通过float 很好,如float can be implicitly converted to double`。
  • 关于 UB 的 user 声明与 scanf() 有关。
  • @chux - 由于scanf 是一个指针,它不会将指向float 的指针提升为指向double 的指针。

标签: c printf


【解决方案1】:

将float 传递给printf 并不是未定义的行为——这简直是不可能的。在printf 收到之前,float 将被提升为 double。

scanf 不同,因为您(至少通常)传递给scanf 的是指针,而不是数据对象本身。由于您传递的是指向原始数据的指针,因此对于 scanf,您需要区分 float 和 double。

【讨论】:

    【解决方案2】:

    vararg 函数中的float 始终提升为double。

    scanf 处理指针。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多