![](/img/trans.png)
[英]printf performance: Better to use “%d” or “%c” for single digit numbers
[英]Why single digit numbers are appended with “D” (in C output)?
为什么单个数字会附加“D”(在 C 输出中)?
以下代码
#include <stdio.h>
int main(void)
{
int c = 0;
printf("%d\n", c);
return 0;
}
一旦编译并运行,输出0
,正如我所期望的那样。
虽然,这段代码
#include <stdio.h>
int main(void)
{
int c = 0;
while (getchar() != EOF) {
++c;
}
printf("%d\n", c);
return 0;
}
一旦编译并运行,在立即触发EOF
之后——由于某种原因输出0D
,尽管c
的值(据我所知)应该与第一种情况完全相同。
所有单个数字(即1D
、 2D
、 3D
... 9D
)都会发生同样的情况,从10
开始,不再看到附加的D
。
我想知道:
为什么在第二种情况下D
附加到 output 而不是第一种情况(即使c
应该保持相同的值)?
是否有可能避免这个D
附加(以及如何,如果是的话)?
无论出于何种原因,您的代码根本无法 output 为“D”。 除非确实发生了一些不确定的事情,例如编译器或 glibc 中的错误。 或者可能是 memory 中的位翻转。
“D”很可能是由于您使用的终端,但您的代码根本不能 output 它。
嗯,机会很小。 如果您读取的字符数超过INT_MAX
,则有符号的 integer c
将溢出,从而调用未定义的行为。 这不太可能 output 为“D”,但有可能。
在发布问题时,我认为这种行为与这种情况有关,但事实证明,它与代码无关,只是终端行为。
一些程序员老兄在评论中的建议是完全正确的:终端只是输出程序的^D
和 output 然后覆盖^
,但不是D
,因此对于个位数的数字 output 最终会附加D
。
两个(或更多)数字只会覆盖整个^D
。
我可以通过将EOF
触发序列更改为Ctrl + L (通过stty eof ^L
)来验证这一点,然后 output 变为1L
、 2L
、 3L
... 9L
。
正如Jonathan Leffler在上面的评论中所说,禁用控制字符的回显(通过stty -echoctl
)将解决该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.