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输出添加前缀,但我错了,因为它在最后一个输出中的奇怪行为是在小数点后打印零。
有人可以解释这#是什么以及它在这里做什么吗?

4

5 回答 5

8

#标志具有不同的行为,具体取决于上下文。

如果它与o, x, orX说明符一起使用,则该值分别以0, 0x, or0X开头。

如果它与a/ Ae/ Ef/FG一起使用,则该值始终以小数点结尾。

这种行为在网络上的多个地方都有很好的记录。搜索“printf”和可能的“格式说明符”通常会找到很多好的链接。这里有一些可以激发你的食欲:

于 2013-07-10T19:13:33.237 回答
1

从 POSIX 手册页man 3p printf

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

简单地说:它打印替代格式,无论它是什么。对于十六进制。值,它是前缀0x,对于八进制0,对于浮点,它强制一些十进制规则......

于 2013-07-10T19:13:02.630 回答
1

我认为如果您在这里阅读 C 的 printf 函数,您将能够进一步理解诸如“#”之类的东西。

与 o、x 或 X 说明符一起使用时,对于不同于零的值,该值分别以 0、0x 或 0X 开头。与 a、A、e、E、f、F、g 或 G 一起使用,即使后面没有数字,它也会强制书面输出包含小数点。默认情况下,如果后面没有数字,则不写入小数点。

于 2013-07-10T19:13:51.660 回答
1

摘自维基百科

# 替代形式。对于“g”和“G”,不删除尾随零。对于“f”、“F”、“e”、“E”、“g”、“G”,输出始终包含小数点。对于“o”、“x”和“X”,0、0x 和 0X 分别被添加到非零数字前面。

于 2013-07-10T19:14:29.897 回答
0

%#o(八进制)插入了 0 前缀。

%#x (Hex) 0x 前缀添加到非零值。

%#X (Hex) 0X 前缀添加到非零值。

%#g 始终显示未删除的小数点尾随零。

因为您使用的是 %#g,所以小数点后一定会出现零。

于 2013-08-01T15:30:53.420 回答