2013-07-10 117 views
1

我想出了一个代码这是什么“#”是在这里做

#include <stdio.h> 

int main() 
{ 
    int i = 1427; 
    double d = 1427.0; 

    printf("%#o\n", i); 
    printf("%#X\n", i); 
    printf("\n%g\n", d); 
    printf("%#g\n", d); 
    return 0; 
} 

即给予输出:

02623 
0X593 

1427 
1427.00 

首先我想#用于前缀0到输出,但我错了,因为它在上次输出中的奇怪行为,它在小数点后打印零。
有人能解释这#是什么,它在这里做什么?

+7

是的,'printf()'的[documentation](http://pubs.opengroup.org/onlinepubs/009695399/functions/fprintf.html)有一个很好的解释。 – 2013-07-10 19:12:46

+3

**版主注意:**评论是为了澄清问题,而不是进行元讨论。有一个网站,或使用聊天。 http://meta.stackexchange.com/questions/19756/how-do-comments-work –

回答

8

#标志具有不同的行为,根据上下文。

如果它与ox,或X说明符所使用的,值前面带有0,分别0x,或者0X

如果是用a/Ae/Ef/F,或G使用的,值总是与一个小数点结束。

此行为在网络上的多个地方记录得很清楚。搜索“printf”和可能的“格式说明符”通常会形成很多良好的链接。这里有几个磨你的胃口:

+0

@Cody Gray;多谢,伙计。你提供了非常好的链接(特别是[这](http://msdn.microsoft.com/en-us/library/8aky45ct.aspx)帮助了很多)。我甚至不知道这是一面旗帜! – haccks

1

从POSIX手册页man 3p printf

#:指定值要被转换为另一种形式。对于o转换,它会提高精度(如有必要),以强制 结果的第一个数字为零。对于x或X转换说明符,非零结果的前缀应为0x(或0X)。对于a, A,e,E,f,F,g和G转换说明符,结果应始终包含一个小数字符,即使没有数字跟在基数之后。没有这个标志,只有在数字跟随它时,这些转换的结果才会出现一个基数字符。对于g和G转换 说明符,尾部零不得像结果一样从结果中删除。对于其他转换说明符,行为是未定义的 。

把它简单化:它打印替代格式,无论它是什么。为十六进制。值,它是前缀0x,八进制0,以及浮点,它迫使一些小数规则...

1

我认为,如果你了解C的printf函数here,你会能够进一步了解诸如“#”等内容。

与o,x或X说明符一起使用时,对于不同于零的值,值分别先于0,0x或0X 。与a,A,e,E,f一起使用, F,g或G会强制写入的输出包含一个小数点,如果没有更多数字出现,即使为 。默认情况下,如果没有数字,则不写入小数点 。从wikipedia

1

Exerpt:

#替换形式。对于'g'和'G',尾部零不会被删除。对于'f','F','e','E','g','G',输出总是包含一个小数点。对于'o','x'和'X',分别为0,0x和0X的前缀为非零数字。

0

%#o(Octal)0前缀插入。

%#x(十六进制)0x前缀添加到非零值。

%X(十六进制)0X前缀添加到非零值。

%g总是显示小数点后 零不被删除。

因为您正在使用%#g,所以零必然会出现在小数点后面。