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
相关产品推荐
相关产品推荐

