printf和co如何区分float和double

Rom*_*her 44 c floating-point printf

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

PS我可以看到如何通过将值复制到临时和转换(这是正确的吗?)可以起作用,但是它对scanfs/sscanf有什么作用?

Ste*_*sop 65

它没有区别.不可能收到一个floatvararg:float你提供的任何论据都会首先被提升为double.

6.5.2.2/6定义了"默认参数提升",而/ 7表示默认参数提升应用于"尾随参数",即varargs表示....

它对scanfs/sscanf有什么用?

%f对格式scanf需要一个指针float.%lf需要指针double,%Lf需要指针long double.

将值复制到temp和cast(这是对的吗?)

如果你提供一个float参数,那么实现会创建一个double类型的临时函数,用float值初始化它,并将其作为vararg传递.根据定义进行的转换是通过使用强制转换操作符进行显式转换 - 如果您愿意,可以进行强制转换,以便使读者清楚地知道发生了什么,但是float f = 3; printf("%f", f);完全相同float f = 3; printf("%f", (double)f);.默认参数提升与强制转换具有相同的含义.

  • 哦,如果你的意思是"我可以使用%lf和%Lf作为`printf`和co的格式",那么是的,你可以.%lf与%f完全相同,都采用"double".%Lf需要一个"长双倍". (7认同)