#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 行为吗?当我使用上面的标志时,我得到正确的值。 所以告诉我,我是对还是错。
答案 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)
答案 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。措辞基本上与标准相同。强调我的)