此问题在此处已有答案:
What default promotions of types are there in the variadic arguments list?(1个答案)
八年前就关门了。
我读到printf的%f说明符用于double,并且它会自动将float转换为double,但我在书中找不到任何证明(尽管在网上有说明)。
我没有访问ANSI C标准文件的副本,也找不到glibc源代码中的特定位置。我已经在“C编程语言,第二版”中进行了搜索。
我需要一些专门针对ANSI C的东西。
正如effeffe所指出的,在C89标准www.example.com中有一个段落3.3.2.2说明了我在寻找什么,在C99中只是一个不同的段落。
2条答案
按热度按时间3xiyfsfu1#
它不是printf函数。在具有可变参数的函数中,默认参数提升使用临时double变量,该变量使用传入的float初始化,导致float被视为double。
在可变长度参数列表的可变长度部分,“默认参数提升”适用:char和short int类型升级为int,float类型升级为double。
参考文献:ISO第6.3.2.26.3.5节第177页,第9.4节第272-3页
第6.5.2.2章。
vq8itlhq2#
看一下the description of printf and the format specifiers。
它列出了用于十进制浮点数的
f
。它没有说它是否适合float
或double
。再往下一点,该页面中有一个表,描述了长度子说明符,例如
%lf
。它显示:添加
l
子说明符不会改变%f
的含义。它还表明%f
用于double
s而不是float
s。从这一点可以看出float
到double
的转换。