[英]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.