这是来自Ritchie & Kernighan 的 The C Programming Language 的一些示例代码。
int c;
while((c=getchar())!=EOF) {
putchar(c);
}
请注意, putchar 指的是int类型的变量。为什么可以使用此代码返回和显示字符和整数?
Anint
通常由 4 个字节表示,而 achar
实际上只是 1 个字节的数据。int
您可以轻松地在返回的单曲中存储完整的字符以及更多内容getchar()
。当一个 int 被传递给putchar(int)
它时,它只是在显示它之前去掉额外的空间。这种技术对于传递EOF
实际上根本不是 achar
而是int
表示文件结束的 an 非常有用。
char 类型只不过是一个整数,在大多数情况下只是一个 8 位字节。int 类型是一个整数,它通常更宽,因此可以保留 char 可以保留的所有可能值。为了使检查工作,它必须保持sizeof(int) > sizeof(char)
. 几乎总是如此。但如果我记得很清楚,据说该标准并没有强制要求这样做;这意味着检查已读取的 EOF 是否为真正的文件结尾的唯一可移植且安全的方法是检查feof(FILE *)
. (例如,如果在您的系统上 CHAR_BIT 为 16,则 sizeof(char) == 1 根据定义,但 sizeof(int) 也可能为 1)。
getchar()
返回int
,以便它可以可靠地保存该EOF
值(定义为任何负整数,在大多数实现中为-1)。根据char
实现,类型可以是有符号的或无符号的。如果它是有符号的,那么它可能能够保存在类型范围内EOF
提供的值,如果它是无符号的,那么在转换为类型时它可能与实际的字符值无法区分。EOF
signed char
EOF
unsigned char