printf中的#flag如何工作?

时间:2014-10-10 09:34:43

标签: c printf

#include <stdio.h>
int main()
{
  float x;
  x=(int)(float)(double)(5.5);
  printf("%#u",x);
  return 0;
}

printf中的#标志如何在这里工作?

每次运行此代码时,我都会得到不同的(垃圾)值。

我知道#标志仅适用于o , 0x, 0X, e, E, f, g, G,但是当它没有为整数定义时。

这是 Undefined 行为吗?当我使用上面的标志时,我得到正确的值。 所以告诉我,我是对还是错。

3 个答案:

答案 0 :(得分:3)

来自c11标准。

7.21.6.1。 P6:

  

#:

     

结果转换为“替代形式”。对于o转换,它会增加   精度,当且仅在必要时,强制结果的第一个数字为a   零(如果值和精度均为0,则打印单个0)。对于x(或X)   转换时,非零结果的前缀为0x(或0X)。对于a,A,e,E,f,F,g,   和G转换,总是转换浮点数的结果   包含小数点字符,即使后面没有数字。 (通常,a   只有数字时,小数点字符才会出现在这些转换的结果中   跟着它。)对于g和G转换,尾随的零没有被删除   结果。对于其他转化,行为未定义

因此,澄清一下,#u一起使用是未定义的。

答案 1 :(得分:1)

来自the manual page

  

#

     

该值应转换为&#34;替代形式&#34; [...]对于其他转换,结果未定义。

是的,它未定义。

答案 2 :(得分:0)

将此标志与列出的转换之外的任何内容一起使用是未定义的行为。不要在其他转换中使用它。

  

该值应转换为&#34;替代形式&#34;。

     

对于 o转换,输出字符串的第一个字符为零(如果它不是零,则前缀为0)。

     

对于 x和X转换,非零结果的字符串为&#34; 0x&#34; (或&#34; 0X&#34;用于X转换)前置。

     

对于 a,A,e,E,f,F,g和G转换,结果将始终包含小数点,即使后面没有数字(通常为小数点)只有在跟随数字后才会出现在这些转化的结果中。

     

对于 g和G转换,不会从结果中删除尾随零,否则就会删除。

     

对于其他转化,结果未定义。

(取自printf(3)-manpage。措辞基本上与标准相同。强调我的)