【发布时间】: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 todouble`。 -
关于 UB 的 user 声明与
scanf()有关。 -
@chux - 由于
scanf是一个指针,它不会将指向float的指针提升为指向double的指针。