C语言程序题,请教高手,最好也能用软件试一下

#include"stdio.h"
main()
{int n1=0,n2=0,n3=0;char ch;
while(ch=getchar()!='!')
switch(ch)
{case '1':case '3':n1++;break;
case '2':case '4':n2++;break;
default:n3++;break;
}
printf("%d%d%d\n",n1,n2,n3);
}
输入是01234567!回车

题答案是224
程序结果是008
哪里有问题,为什么输入的字符和case后面字符匹配不上?

我的程序结果也是008


我们一起来看这个程序啊,我想你一定是这么做的!

输入的是0

没有所以就做n3++

输入1

做的是n1++

输入2

n2++

输入3

n1++

输入4

n2++

然后567都是n3++

所以觉得是224


但是你忽略了一个地方:

 while(ch=getchar()!='!')
ch的值是(getchar()!='!')的逻辑值
 ch全是逻辑1,(1!='!')最后就是逻辑0所以跳出循环。
所以是008

你可以试试

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-01-31
关键在语句while()中,这里有个运算符优先级的问题。
在C中,“=”要比“!=”的优先级为低。
所以在计算while()中的表达式,程序首先判断
getchar()!='!'
真假,再将这个判断的结果(只能是0和1)赋给ch。
由于在输入01234567!的过程中,前8个字符都不等于‘!’所以ch=1,进入循环,
而在四个case中,‘1’、‘2’、‘3’、‘4’都不符合ch=1,所以只能进入default中,所以n3=8
直到输入‘!’,getchar()!='!'为假,ch=0,退出循环执行输出语句printf,这样n1,n2一直都没有参加运算,所以其值始终保持初始值0,故最后输出008
要想得到正确答案224,只需把while中的表达式的运算顺序改一下即可:
while((ch=getchar())!='!')
这样就能保证ch能够接收按键的ASCII码了。本回答被提问者采纳
第2个回答  2014-01-29

结果是224的前提是循环判断语句应该是

while((ch=getchar())!='!')

注意括号,是

(ch=getchar())!='!'

而不是原先的

ch=getchar()!='!'

第3个回答  2014-01-29
应该是(ch=getchar())!='!',把赋值加上括号。否则相当于ch=(getchar()!='!'),下面的switch总是走default。
第4个回答  2014-01-29
while(ch=getchar()!='!')

改为
while((ch=getchar())!='!')
即可。
相似回答
大家正在搜