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

代码片段if (ungetc(getc(in), in) != EOF)是否等价于判断文件未到末尾?

关于if (ungetc(getc(in), in) != EOF)的功能解析

先拆解涉及的两个标准库函数:

  • getc(in):从文件指针in指向的输入流读取一个字符,成功则返回该字符(以unsigned char转换为int的形式);若到达文件末尾或读取出错,返回EOF。
  • ungetc(c, in):将字符c推送回输入流,使得后续的读取操作能再次获取该字符;成功则返回c,失败则返回EOF。

再分析这条语句的逻辑:

  1. 先执行getc(in):
    • 如果返回EOF(要么到了文件尾,要么读取出错),此时调用ungetc(EOF, in)属于未定义行为,但多数实现会让ungetc返回EOF,条件!= EOF不成立。
    • 如果成功读到一个字符,再调用ungetc把这个字符推回流中(相当于“反悔”这次读取,让后续操作还能读到它),此时ungetc返回读到的字符(非EOF),条件成立。

所以这条语句在大多数场景下,效果等价于判断文件尚未到达末尾,但存在两个特殊情况:

  • 当读取操作发生错误(而非到达文件尾)时,getc返回EOF,条件也会不成立,但这不是文件尾的情况。
  • 若ungetc调用失败(比如输入流不支持回退,或已经达到回退的最大次数),即使getc成功读到字符,ungetc也会返回EOF,导致条件不成立,但这种情况非常罕见。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:47:38