好吧,几个月前我读过另一本“众所周知”的C书(用我的语言),我从来没有学到任何东西。K&R 在 20 页中写了 3 章的方式简直令人惊叹,当然我不能指望巨大的解释,但这也引发了问题。
我对这一点有疑问 1.5.1 这本书说(第 16 页):
main(){
int c;// <-- Here is the question
c=getchar();
while (c != EOF){
putchar(c);
c = getchar();
}
}
[...] char 类型专门用于存储此类字符数据,但可以使用任何整数类型。我们使用 int 是出于一个微妙但重要的原因。问题在于将输入的结尾与有效数据区分开来。解决方案是 getchar 在没有更多输入时返回一个独特的值,该值不能与任何真实字符相结合。此值称为 EOF,表示“文件结束”。我们必须声明 c 是一个足够大的类型来保存 getchar 返回的任何值。我们不能使用 char,因为除了任何可能的 char 之外,c 必须足够大以容纳 EOF。因此我们使用 int.[...]
在谷歌搜索另一种解释后:
EOF 是一个表示文件结束的特殊宏(Linux:使用键盘上的 CTRL+d 来创建它,Windows 命令:使用 CTRL+z(可能必须在新行的开头,后跟 RETURN)):通常 EOF = -1,但依赖于实现。必须是对于任何可能的字符都不是有效值的值。出于这个原因, c 是 int 类型(不是人们可能期望的 char )。
所以我将源代码从 int 修改为 char 以查看有什么问题,关于取 EOF 值......但没有问题。以同样的方式工作。
我也没有破坏 getchar 如何获取我写的每个字符并打印所有内容。Int 类型是 4 字节长,因此它可以在一个变量中占用 4 个字符。但我可以输入任意数量的字符,它会以相同的方式读取和写入所有内容。而对于 char,也会发生同样的情况……真正发生了什么?超过 1-4 个字符时,值存储在哪里?