1. 练习1-6解析:理解getchar()与EOF的关系
在C语言学习过程中,理解输入输出操作是基础中的基础。K&R的《C程序设计语言》作为经典教材,其练习往往能帮助我们深入理解这些基础概念。练习1-6看似简单,却包含了几个关键知识点:getchar()函数的行为、EOF的含义、运算符优先级以及while循环的条件判断逻辑。
1.1 程序代码解析
让我们先完整看一下这个练习的代码:
c复制#include <stdio.h>
main()
{
int c;
while(c = getchar() != EOF)
printf("%d\n", c);
printf("%d - at EOF\n", c);
}
这段代码的核心目的是验证表达式getchar() != EOF的值。程序会持续从标准输入读取字符,直到遇到EOF(文件结束符)为止。在每次循环中,它会打印出getchar() != EOF这个表达式的值。
1.2 关键表达式解析
代码中最关键的部分是while循环的条件表达式:
c复制c = getchar() != EOF
根据K&R原著第17页的解释,这个表达式实际上等同于:
c复制c = (getchar() != EOF)
这是因为!=运算符的优先级高于=赋值运算符。理解这一点非常重要,否则可能会误读程序的逻辑。
提示:在C语言中,关系运算符(如!=)的优先级高于赋值运算符(=)。如果不确定运算符优先级,使用括号明确表达意图是个好习惯。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. getchar()与EOF的深入理解
2.1 getchar()函数的行为
getchar()是C标准库中的一个函数,它从标准输入(通常是键盘)读取一个字符。每次调用时,它会:
- 等待用户输入(如果输入缓冲区为空)
- 从缓冲区读取一个字符
- 返回该字符的ASCII码值(作为int类型)
值得注意的是,getchar()返回的是int类型而非char类型,这是为了能够表示EOF(通常是-1)以及所有可能的字符值。
2.2 EOF的含义与产生方式
EOF(End Of File)是一个特殊的常量,定义在<stdio.h>中,通常值为-1。它表示"文件结束"或"输入结束"。在终端输入时,可以通过以下方式产生EOF:
- Unix/Linux/Mac: Ctrl+D
- Windows: Ctrl+Z
当getchar()遇到文件结束或输入结束时,它会返回EOF,这时getchar() != EOF表达式就会求值为0(假)。
2.3 表达式求值过程
让我们详细分析c = getchar() != EOF的执行过程:
getchar()被调用,读取一个字符- 如果读取成功(不是EOF),
!=运算结果为1 - 如果读取失败(遇到EOF),
!=运算结果为0 - 这个结果(1或0)被赋值给变量c
- while循环根据c的值决定是否继续循环
