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
,这是什么意思?
注意:这发生在 cc
、gcc
和 clang
时。
事实证明,D
是 ^D
的一部分,当我输入 EOF(control
+ D
在 Unix 上)时,它会打印到控制台。因为 printf
语句的开头没有 \n
,所以 single-digit 数字将覆盖 ^
,而 double-digit 数字将覆盖整个 ^D
,这就是给人一种奇怪行为的印象。
您使用的是哪个版本的 gcc?我 运行 使用 gcc 的完全相同的代码并且运行良好。也许这是您的终端遗留下来的人工制品,它试图在文件末尾打印 Ctrl-D
我正在研究 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
,这是什么意思?
注意:这发生在 cc
、gcc
和 clang
时。
事实证明,D
是 ^D
的一部分,当我输入 EOF(control
+ D
在 Unix 上)时,它会打印到控制台。因为 printf
语句的开头没有 \n
,所以 single-digit 数字将覆盖 ^
,而 double-digit 数字将覆盖整个 ^D
,这就是给人一种奇怪行为的印象。
您使用的是哪个版本的 gcc?我 运行 使用 gcc 的完全相同的代码并且运行良好。也许这是您的终端遗留下来的人工制品,它试图在文件末尾打印 Ctrl-D