printf的格式控制的完整格式: % - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:
int a = 5; printf("%f",(float&)a);
//如果这样写,则会默认的读取以地址a开始的4个字节的变量解释成float去输出。即以float型输出。
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。N指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
6 f格式符,用来输出实数(包括单、双精度),以小数形式输出。格式:%f,%m.nf,%-m.nf都可。
注意:单精度实数的有效位数一般为7位,双精度为16位。
7 int a = 5; printf("%f",a);
//如果这样写,则会默认的读取以地址a开始的8个字节的变量解释成double去输出。即默认以double型输出。
【转】
问:有人告诉我不能在printf中使用%lf。为什么printf()用%f输出double型,而scanf却用%lf呢?
答:printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。参见问题15.2。
(严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)
参见问题12.15和15.2。
对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。
此回答摘自POJ1113 DISCUSS,当时错了很多次,最后才发现是输出用来%f
--#
具体的看
http://book.csdn.net/bookfiles/892/10089228074.shtml,这儿还有个表
若想看C++标准看这 CSDN上的飞雪大牛摘的
http://hi.baidu.com/feixue/blog/item/4a84a97732457d12b051b90e .html
答:printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。参见问题15.2。
(严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)
参见问题12.15和15.2。
对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。
此回答摘自POJ1113 DISCUSS,当时错了很多次,最后才发现是输出用来%f
具体的看
http://book.csdn.net/bookfiles/892/10089228074.shtml,这儿还有个表
若想看C++标准看这 CSDN上的飞雪大牛摘的
http://hi.baidu.com/feixue/blog/item/4a84a97732457d12b051b90e