传递浮动到printf未定义的行为?

时间:2014-12-15 23:37:08

标签: c printf

C99标准在fprintf的规范中讨论了 double (后来适用于printf)。它表示"表示浮点数的double参数被转换..."然后在第9段中,它说:

  

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

所以我希望以下内容是未定义的行为,但我的编译器并没有对此发出警告。

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

另一方面,fscanf的规范说"浮点数"而不是双倍。它是未定义的行为,如this user声明吗?

2 个答案:

答案 0 :(得分:4)

float传递给printf并非未定义的行为 - 它只是不可能。在float收到double之前,printf将被提升为scanf

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

答案 1 :(得分:4)

vararg函数中的

float始终提升为double

scanf处理指针。