C 作为printf占位符的%0.2lf和%.2lf之间有什么区别?
我知道在占位符的宽度之前放置任意数量的C 作为printf占位符的%0.2lf和%.2lf之间有什么区别?,c,format,width,printf,C,Format,Width,Printf,我知道在占位符的宽度之前放置任意数量的0,可以实现零填充。例如,printf(“%02d”,6)打印06 但是在占位符的精度之前放置一个0会做什么呢?例如,对于printf(“%0.2lf”,0.123)和printf(“%.2lf”,0.123),输出为0.12 如果它不起作用,是否有首选格式?它们是“等效的”。如果要使用“%07.2”,则在前面添加额外的零会产生不同 编辑:最初有“%04.2”,这当然没有任何区别,因为带两个小数的浮点始终是4宽。%3.2f//(以浮点打印,宽度至少为3宽,精
0
,可以实现零填充。例如,printf(“%02d”,6)代码>打印06
但是在占位符的精度之前放置一个0
会做什么呢?例如,对于printf(“%0.2lf”,0.123)代码>和printf(“%.2lf”,0.123)代码>,输出为0.12
如果它不起作用,是否有首选格式?它们是“等效的”。如果要使用“%07.2”,则在前面添加额外的零会产生不同
编辑:最初有“%04.2”,这当然没有任何区别,因为带两个小数的浮点始终是4宽。
%3.2f//(以浮点打印,宽度至少为3宽,精度为2)
%0.2lf//(以浮点形式打印,宽度至少为0,精度为2)
%.2lf//(以浮点形式打印,宽度至少为0(默认值),精度为2)
大宗报价
基本上,当我们输出%w.p f
时w
指用于显示值的最小位置数,p
指小数点后的位数。
%3.2f
小数点后有3个宽和2个数字的浮点
%0.2f
浮点至少0宽,小数点后2个数字
%.2f
浮点宽度至少为0(默认值)且精度为2)
但是,如果您使用%0.2f
它可以自动调整其最小宽度,请不要误解0宽度。这些示例应显示其区别:
“%0.2lf”,0.123
->0.12
(零填充最小宽度为0,小数点后两位)
“%6.2lf”,0.123
->\uu 0.12
(最小宽度为6,小数点后两位的空格填充)
“%06.2lf”,0.123
->000.12
(零填充最小宽度为6,小数点后两位)
“%0.6lf”,0.123
->0.123000
(最小宽度为0,小数点后6位)
第一个零指定零填充,后面是最小宽度,默认值为0。因此,它本身实际上被忽略(因为不能填充0宽度)
顺便说一句,正确的形式是%f
,而不是%lf
,对于printf
,如果明确指定了精度,它(0'-填充)不是被忽略了吗?至少在Linux上的gcc中测试时,零填充“起作用”。我很确定这是标准的一部分,但我有点懒,所以我会等待其他人指出我错了。@DyP-零填充在左边,例如0003.12。它不适用于小数点后的零。@teppic C标准(C99和n1256)说,在%0”
中,0
被解释为一个标志,意思是“使用0填充”。但是没有指定最小字段宽度(介于0
和
之间),因此,它实际上被忽略。我以前的信息是从cppreference获得的,但这与标准上说的有点不同。@teppic我同意这不重要,但您的陈述不准确(“0本身指定最小宽度为0”),其中有一个微妙之处,例如,%0s”
导致未定义的行为,因为0
被视为一个标志。@teppic,0并不意味着最小宽度为0(这是什么样的无用信息?)。0是一个标志,表示0-pad而不是空格pad。从你的回答中我可以看出,你已经知道了,所以请不要再说它的意思是“最小宽度为0”,因为它不知道。@Shahbaz-我在谈论这个具体的案例,但由于它似乎会引起混乱,我删除了这个评论。在我们讨论这个问题时,整数提升规则(见C11,6.5.2.2.6)强制将浮点值转换为双精度。这意味着float
和double
都达到printf
为double
,因此%f
和%lf
都期望double
,因此是相同的。这就是为什么您永远看不到%hd
,因为它的工作原理与%d
完全相同。此外,这就是为什么如果将字符赋给%d
,则不需要将其强制转换为int。旁注:这与scanf
不同,因为例如char*
不会升级为int*
@沙巴兹-作为一个侧面点,是的。如果我没记错的话,C99中允许使用%lf
,但完全忽略了l
——尽管%lf可能会给较旧的编译器带来问题。