C99标准在fprintf
的规范中讨论了 double (后来适用于printf
)。它表示"表示浮点数的double
参数被转换..."然后在第9段中,它说:
如果转换规范无效,则行为未定义。 如果任何参数不是相应的正确类型 规范,行为未定义。
所以我希望以下内容是未定义的行为,但我的编译器并没有对此发出警告。
double d = 2.0;
float f = 2.0f;
printf("%f", d);
printf("%f", f); // here
另一方面,fscanf
的规范说"浮点数"而不是双倍。它是未定义的行为,如this user声明吗?
答案 0 :(得分:4)
将float
传递给printf
并非未定义的行为 - 它只是不可能。在float
收到double
之前,printf
将被提升为scanf
。
scanf
是不同的,因为您(至少通常)传递给scanf
的是指针而不是数据对象本身。由于您使用float
传递指向原始数据的指针,因此您需要区分double
和{{1}}。
答案 1 :(得分:4)
float
始终提升为double
。
scanf
处理指针。