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

