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

C语言代码中两段if语句的自增操作未生效,原因何在?

C语言统计字符、行数、单词数代码的逻辑错误分析

你编写的C语言代码意图统计输入的字符数(nc)、行数(nl)和单词数(nw),但运行时两段if语句中的自增操作完全未生效,核心原因是运算符优先级错误。

你的代码

#include <stdio.h>

#define IN 1
#define OUT 0

int main(){
    int n, nc, nl, nw, STATE;

    nc = nl = nw = 0;
    STATE = IN;

    while(n = getchar() != EOF){
        nc++;

        if(n == '\n'){
            nl++;
        }

        if(n == ' ' || n == '\n' || n == '\t'){
            nw++;
        }
    }
    printf("\n%d\t%d\t%d\n", nc, nl, nw);
}

测试输入

"This is another\n
test\n
baby"

实际输出

"25      0       0"

预期输出

"25      2       4"

错误原因

C语言中,不等于运算符!=的优先级高于赋值运算符=。你的循环条件n = getchar() != EOF会被编译器解析为:

n = (getchar() != EOF)

也就是说,n的值并不是getchar()读取到的字符ASCII码,而是一个布尔结果:当getchar()没读到EOF时,getchar() != EOF为真,n被赋值为1;当读到EOF时,n被赋值为0。

因为n的值永远只会是0或1,永远不可能等于'\n'(ASCII码10)、' '(ASCII码32)或'\t'(ASCII码9),所以两个if的条件永远不成立,nl和nw的自增操作自然不会执行。

修正方案

给赋值表达式加上括号,确保先执行赋值再判断:

while( (n = getchar()) != EOF ){
    // 原有逻辑
}

额外优化提示

你的单词数统计逻辑也存在问题:当前代码只要遇到空格、换行或制表符就会让nw自增,连续的空白字符会重复计数。可以利用你定义的IN和OUT状态变量来优化:当状态从IN(在单词内)切换到OUT(在单词外)时,才对nw自增,这样能准确统计单词数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:04