由于它没有强类型,我认为它只是选择了正确的内存大小并根据参数的类型对其进行解释。但是float和double都使用%f,它们的大小不同。
P.S。 我可以看到通过将值复制到临时和转换(这是正确的吗?)的推广可能会起作用 但是它对scanfs / sscanf有什么作用?
答案 0 :(得分:62)
它没有区别。无法接收float
作为vararg:您提供的任何float
参数都会首先提升为double
。
6.5.2.2/6定义了“默认参数提升”,而/ 7表示默认参数提升应用于“尾随参数”,即由...
表示的变量。
它对scanfs / sscanf有用吗?
%f
的{{1}}格式需要指向scanf
的指针。 float
需要指向%lf
的指针,double
需要指向%Lf
的指针。
将值复制到temp和cast(这是对吗?)
如果你提供一个float参数,那么实现会创建一个double类型的临时表,用float值初始化它,并将其作为vararg传递。根据定义,通过使用强制转换运算符进行显式转换 - 如果您愿意,可以进行强制转换,以便让读者清楚地知道发生了什么,但long double
正好是与float f = 3; printf("%f", f);
相同。默认参数提升与强制转换具有相同的含义。