【发布时间】:2011-06-18 11:40:55
【问题描述】:
由于它不是强类型,我认为它只是选择了正确的内存大小并根据参数类型对其进行解释。但是 float 和 double 都使用 %f 并且它们的大小不同。
附: 我可以看到通过将值复制到临时和强制转换(对吗?)进行促销可能会起作用 但它对 scanfs/sscanf 是如何工作的?
【问题讨论】:
标签: c floating-point printf
由于它不是强类型,我认为它只是选择了正确的内存大小并根据参数类型对其进行解释。但是 float 和 double 都使用 %f 并且它们的大小不同。
附: 我可以看到通过将值复制到临时和强制转换(对吗?)进行促销可能会起作用 但它对 scanfs/sscanf 是如何工作的?
【问题讨论】:
标签: c floating-point printf
它没有区别。无法接收 float 作为 vararg:您提供的任何 float 参数首先被提升为 double。
6.5.2.2/6 定义了“默认参数提升”,/7 声明默认参数提升应用于“尾随参数”,即由... 表示的可变参数。
scanfs/sscanf 是如何工作的?
scanf 的 %f 格式需要指向 float 的指针。 %lf 需要指向 double 的指针,%Lf 需要指向 long double 的指针。
将值复制到临时文件并进行强制转换(对吗?)
如果您提供一个浮点参数,那么实现会创建一个双精度类型的临时变量,使用浮点值对其进行初始化,并将其作为可变参数传递。根据定义进行强制转换是使用强制转换运算符进行显式转换——如果你愿意,你可以强制转换,以便让读者清楚地知道发生了什么,但float f = 3; printf("%f", f); 与float f = 3; printf("%f", (double)f);。默认参数提升与强制转换具有相同的含义。
【讨论】:
printf 和 co 中的格式吗”,那么可以。 %lf 与 %f 完全相同,都取double。 %Lf 接受long double。