【问题标题】:How does printf and co differentiate between float and doubleprintf 和 co 如何区分 float 和 double
【发布时间】:2011-06-18 11:40:55
【问题描述】:

由于它不是强类型,我认为它只是选择了正确的内存大小并根据参数类型对其进行解释。但是 float 和 double 都使用 %f 并且它们的大小不同。

附: 我可以看到通过将值复制到临时和强制转换(对吗?)进行促销可能会起作用 但它对 scanfs/sscanf 是如何工作的?

【问题讨论】:

标签: c floating-point printf


【解决方案1】:

它没有区别。无法接收 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);。默认参数提升与强制转换具有相同的含义。

【讨论】:

  • 谢谢,printfs(标准或扩展)是否也接受 double 以保持对称?
  • 哦,如果您的意思是“我可以使用 %lf 和 %Lf 作为printf 和 co 中的格式吗”,那么可以。 %lf 与 %f 完全相同,都取double。 %Lf 接受long double
猜你喜欢
  • 2012-09-18
  • 2011-03-17
  • 1970-01-01
  • 2011-05-04
  • 2021-08-11
  • 2015-06-08
  • 2016-03-11
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多