c-printf和co如何区分float和double

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

附言我可以看到通过将值复制到临时表和强制转换(这对吗?)进行促销的方式但是它对scanfs / sscanf如何工作?

Roman A. Taycher asked 2020-07-30T20:39:07Z
1个解决方案
64 votes

它没有区别。 不可能以变量形式接收float f = 3; printf("%f", f);:您提供的任何float f = 3; printf("%f", (double)f);参数都首先提升为float

6.5.2.2/6定义了“默认参数提升”,/ 7指出默认参数提升应用于“跟踪参数”,即由float f = 3; printf("%f", f);表示的varargs。

对于scanfs / sscanf如何工作?

float f = 3; printf("%f", (double)f);float f = 3; printf("%f", f);格式需要指向float的指针。%lf需要指向double的指针,%Lf需要指向long double的指针。

将值复制到临时表并进行强制转换(对吗?)

如果提供float参数,则实现将创建double类型的临时类型,并使用float值对其进行初始化,并将其作为vararg传递。 通过定义进行强制转换是使用强制转换运算符的显式转换-如果愿意,可以进行强制转换以使读者清楚地了解发生了什么,但是float f = 3; printf("%f", f);float f = 3; printf("%f", (double)f);完全相同。默认参数推广具有相同的功能 意思是演员。

Steve Jessop answered 2020-07-30T20:41:34Z
translate from https://stackoverflow.com:/questions/6395726/how-does-printf-and-co-differentiate-between-float-and-double