printf和co如何区分float和double

由于它没有强types,我认为它只是select了正确的内存大小,并根据参数的types来解释它。 但是float和double都使用%f,而且它们是不同的大小。

PS我可以看到如何通过将值复制到临时和铸造(是这样吗?)可能工作,但它是如何工作的scanfs / sscanf?

它不区分。 不可能接收float作为variables:您提供的任何float参数首先被提升为double

6.5.2.2/6定义了“默认参数促销”,并且/ 7声明了默认参数促销应用于“结尾参数”,也就是用...表示的可变参数。

它是如何工作的scanfs / sscanf?

scanf%f格式需要一个指针来float%lf需要一个指针double%Lf需要一个指向long double的指针。

把这个值复制到一个临时文件并进行转换(是吗?)

如果你提供了一个float参数,那么这个实现会创build一个types为double的临时对象,并用float值初始化它,并将其作为parameter passing。 按照定义进行投射是通过使用投射运算符进行显式转换 – 如果您愿意,可以进行投射,以使读者完全清楚发生了什么,但float f = 3; printf("%f", f); float f = 3; printf("%f", f);float f = 3; printf("%f", (double)f);完全一样float f = 3; printf("%f", (double)f); float f = 3; printf("%f", (double)f); 。 默认参数提升的含义与转换相同。