是否将浮点数传递给 printf 未定义的行为?

use*_*319 4 c printf

C99 标准在 for (随后适用于)的规范中讨论了double。它说“一个表示浮点数的参数被转换......”然后在第 9 段中,它说:fprintfprintfdouble

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

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

double d = 2.0;
float f = 2.0f;
printf("%f", d);
printf("%f", f); // here
Run Code Online (Sandbox Code Playgroud)

另一方面,规范fscanf说“浮点数”而不是双。这是像这个用户声称的那样未定义的行为吗?

Jer*_*fin 6

传递一个floattoprintf不是未定义的行为——这只是不可能的。在float将晋升为doubleprintf接受它。

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