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);
。 默认参数提升的含义与转换相同。