我有一本《C编程语言》一书,在第一章中,它展示了一个简短的代码示例,该代码将字符从stdin复制到stdout。这是代码:
main()
{
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
}
然后作者说,他使用int而不是char,因为char不够大,无法容纳EOF。 但是当我尝试使用 char 时,它以相同的方式工作,即使使用 ctrl+z。 Stack说这是一个重复的,所以我简短地问:
为什么使用"char"是错误的?
如果你会写例如
char c;
c = getchar();
while (c != EOF) {
//...
在条件c != EOF
中,对象c
的值提升为类型int
并比较两个整数。
将变量c
声明为具有类型char
的问题在于,char
类型可以表现为类型signed char
或unsigned char
(取决于编译器选项)。如果类型char
的行为与类型unsigned char
,则表达式c != EOF
将始终计算为逻辑true
。
注意根据C标准EOF
EOF 扩展到整数常量表达式,类型为 int 和一个负值,由多个函数返回以指示文件结束,即不再有来自流的输入;
所以在这次任务之后
c = getchar();
当c
声明为具有类型char
并且类型char
的行为为类型unsigned char
时,c
的值在整数升级后将为正值,因此不会等于负值。
要模拟这种情况,只需将变量c
声明为具有类型unsigned char
unsigned char c;