C、为什么printf要在个位数long后面加一个"D"?

C, why does printf add a "D" after a single digit long?

我正在研究 K&R C 书,其中一个示例程序是这样的:

#include <stdio.h>

int main() {
    long nc;

    nc = 0;
    while (getchar() != EOF) {
        ++nc;
    }
    printf("%ld", nc);

    return 0;
}

当我 运行 这个程序时,它的大部分行为都符合我的预期。所以对于像 This is a sentence 这样的输入,它会打印 19.

但是,如果我输入任何少于 10 个字符(包括 EOF),输出数字后面会附加一个大写字母 D

例如对于输入 hello,输出为 6D

为什么要在整数值后面附加一个 D,这是什么意思?

注意:这发生在 ccgccclang 时。

事实证明,D^D 的一部分,当我输入 EOF(control + D 在 Unix 上)时,它会打印到控制台。因为 printf 语句的开头没有 \n,所以 single-digit 数字将覆盖 ^,而 double-digit 数字将覆盖整个 ^D,这就是给人一种奇怪行为的印象。

您使用的是哪个版本的 gcc?我 运行 使用 gcc 的完全相同的代码并且运行良好。也许这是您的终端遗留下来的人工制品,它试图在文件末尾打印 Ctrl-D