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

C语言getchar()行为疑问:两段代码为何tabul数组填充结果不同?

K&R习题1-13:两段代码的逻辑差异分析

我刚接触编程,正在阅读K&R书籍并完成书中习题,在做习题1-13时遇到了第一个问题:为何下面这段代码能正常填充tabul数组:

while ((c = getchar()) != EOF) {
    if (c == ' ' || c =='\n' || c == '\t') {
        ++tabul[lw];
        lw = 0;
    } 
    else
        ++lw;
}

而这段代码却无法填充tabul数组:

while ((c = getchar()) != EOF) {
    if (c != ' ' || c !='\n' || c != '\t') {
        ++lw;
    } else {
        ++tabul[lw];
        lw = 0;
    }
}

核心问题:逻辑运算符的误用

第二段代码的问题出在if条件的逻辑判断上:

  • 第一段代码逻辑正确:当字符是空格、换行或制表符时,将当前记录的单词长度lw对应的tabul元素计数加1,然后重置lw;如果是普通字符,就递增lw记录单词长度。
  • 第二段代码里的if (c != ' ' || c !='\n' || c != '\t')逻辑完全错误。因为一个字符不可能同时是空格、换行和制表符,所以不管c是什么值,这个条件永远为真:
    • 若c是空格,c != '\n'和c != '\t'都是真,整个||表达式结果为真;
    • 若c是普通字符,三个!=条件至少有两个为真,结果还是真。

这导致else分支永远不会被执行,tabul数组根本没有机会被赋值,自然无法填充。

修正方法

把第二段代码的||换成&&,正确的条件应该是:

if (c != ' ' && c !='\n' && c != '\t')

这样只有当字符同时不是空格、换行和制表符时,才递增lw;遇到分隔符时进入else分支统计,逻辑就和第一段代码一致了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:28:13