You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何执行表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:10:37