我想出了一个代码
#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
,但我错了,因为它在上一次输出中的奇怪行为,它在十进制后打印零。
有人可以解释这个#
是什么以及它在这里做了什么?
答案 0 :(得分:8)
#
标志具有不同的行为,具体取决于上下文。
如果它与o
,x
或X
说明符一起使用,则值前面有0
,0x
或{{1分别。
如果它与0X
/ a
,A
/ e
,E
/ f
或F
一起使用,值始终以小数点结束。
此行为在网络上的多个位置都有很好的记录。搜索“printf”和可能的“格式说明符”通常会产生很多好的链接。以下是一些可以满足您的胃口:
答案 1 :(得分:1)
来自POSIX手册页man 3p printf
:
#:指定将值转换为替代形式。对于o转换,它会增加强制的精度(如果需要) 结果的第一个数字为零。对于x或X转换说明符,非零结果必须以0x(或0X)为前缀。为一个, A,e,E,f,F,g和G转换说明符,结果应始终包含基数字符,即使基数字符后面没有数字 - 之三。如果没有此标志,只有在跟随数字后,才会在这些转换的结果中显示基数字符。用于g和G转换 说明符,尾随零不应像通常那样从结果中删除。对于其他转换说明符,行为是 未定义。
简单来说:它打印替代格式,无论它是什么。对于十六进制对于八进制0x
,它为前缀0
,对于浮点,它强制使用一些十进制规则...
答案 2 :(得分:1)
我认为如果您阅读有关C的printf函数here,您将能够进一步理解诸如“#”之类的内容。
与o,x或X说明符一起使用时,该值的前面是0,0x或0X 分别用于不同于零的值。与a,A,e,E,f一起使用, F,g或G它强制写入的输出包含小数点 如果没有更多数字跟随。默认情况下,如果没有数字,则不包含小数 这是写的。
答案 3 :(得分:1)
从wikipedia开始:
#替代表格。对于'g'和'G',不删除尾随零。对于'f','F','e','E','g','G',输出始终包含小数点。对于'o','x'和'X',分别为0,0x和0X,前置为非零数字。
答案 4 :(得分:0)
%#o(八进制)0插入前缀。
%#x(十六进制)0x前缀添加到非零值。
%#X(十六进制)0X前缀添加到非零值。
%#g始终显示小数点尾随 零没有删除。
由于您使用的是%#g,因此必须在十进制之后出现零。