printf和co如何区分float和double

问题描述

| 因为它不是强类型的,所以我认为它只是选择了正确的内存大小并根据参数的类型对其进行了解释。但是float和double都使用%f,并且它们的大小不同。 附言 我可以看到通过将值复制到临时表和强制转换(这对吗?)进行促销的方式 但是它对于scanfs / sscanf如何工作?     

解决方法

        它没有区别。不可能将
float
接收为变量:将您提供的任何
float
参数首先提升为
double
。 6.5.2.2/6定义了\“默认参数提升\”,并且/ 7指出默认参数提升应用于\“跟踪参数\”,即由
...
表示的varargs。   对于scanfs / sscanf如何工作?
scanf
%f
格式需要指向
float
的指针。
%lf
需要指向
double
的指针,
%Lf
需要指向
long double
的指针。   将值复制到临时表并进行强制转换(对吗?) 如果提供float参数,则实现将创建一个double类型的临时类型,并使用float值对其进行初始化,并将其作为vararg传递。通过定义进行强制转换是使用强制转换运算符的显式转换-如果愿意,可以进行强制转换以使读者清楚地了解发生了什么,但是ѭ11与ѭ12完全相同。默认参数提升与强制转换具有相同的含义。