为何执行表达式c = getchar() != EOF时代码输出11而非1?
问题分析与解答
核心原因:运算符优先级 + 输入缓冲区的双重影响
你对运算符优先级的理解是对的:!=优先级高于=,所以while (c = getchar() != EOF) 实际等价于 while (c = (getchar() != EOF))——只要getchar()没读到EOF,c就会被赋值为1。但输出11的关键在于输入缓冲区的内容:
- 当你输入一个可见字符(比如
a)再按回车时,输入缓冲区里会存入两个字符:你输入的目标字符(如a)和换行符\n。 - 第一次循环:
getchar()读取到目标字符,判断不等于EOF,c=1,输出1。 - 第二次循环:
getchar()读取到换行符\n,同样不等于EOF,c再次被赋值为1,又输出1。 - 两次输出连在一起,就成了
11。
而直接按回车时,输入缓冲区里只有换行符\n,getchar()仅读取一次,所以只输出一个1。
验证与修正示例
验证逻辑的代码
可以修改代码打印读取到的具体字符,直观看到缓冲区内容:
#include <stdio.h> int main() { int c; while (c = (getchar() != EOF)) { printf("c=%d, 读取的字符: %c\n", c, getchar()); } return 0; }
实现“输入一个字符输出一个1”的修正代码
如果要让每次输入的可见字符对应一个1,需要先赋值再判断,同时可过滤换行符:
#include <stdio.h> int main() { int c; // 先把读取结果赋值给c,再判断是否为EOF while ((c = getchar()) != EOF) { // 只对非换行符输出1 if (c != '\n') { printf("1"); } } return 0; }
内容的提问来源于stack exchange,提问作者Anthony Longtin
相关产品推荐
相关产品推荐

