c语言问题,下面这段程序输出为什么是ace?

char c;
for(c=getchar();getchar()!=' #';c=getchar())
putchar(c);

输入abcde#<回车>,输出是ace这是为什么。。。。
还有getchar()!=' #'中#前面有个空格,如果把空格去掉,输出是ac,这又是为毛。。。

1.没有空格时。
首先执行c=getchar();此时c='a';

然后比较getchar()!=' #';此时,getchar()=‘b’;但是c=‘a’;

所以输出a

再执行c=getchar();此时c='c';
然后比较getchar()!=' #';此时,getchar()=‘d’;但是c=‘c’;
所以输出c。所以输出对的。
2.有空格时,情况比较诡异。c是字符型。保留的是‘ #’中的‘#’,即最后一个字符。ac输出与前面一致。
问题就是为什么输出e了。

首先执行c=getchar();此时c='a';
然后比较getchar()!=' #';此时,getchar()=‘b’;但是c=‘a’;
所以输出a
再执行c=getchar();此时c='c';
然后比较getchar()!=' #';此时,getchar()=‘d’;但是c=‘c’;
所以输出c。
再执行c=getchar();此时c='e';
然后比较getchar()!=' #';此时,getchar()=‘#’,不知道为什么没有退出;但是c=‘e’;
所以输出e。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-22
getchar()!=' #'这一句读到的字符并没有屏幕输出。屏幕输出的是
for(c=getchar();getchar()!=' #';c=getchar())中第一个c=getchar()之后和连续输出的最后那个c=getchar()。
单引号中只能有一个字符,否则即使能通过编译也是不规范的写法。本回答被网友采纳
第2个回答  2012-10-22
这个程序的过程是这样的,输入的是abcde#

先对c进行赋值,运行了一次getchar(),得到c=a的结果,之后,运行一次getchar(),因为判断循环条件那里还有一个getchar(),这时读的是b,判断是不是等于#,b不等于#,于是运行putchar(c),因为for(c=getchar();getchar()!=' #';c=getchar())这个语句后面的一个c=getchar()会又运行一次(想想for(i=0;i<n;I++),一样的道理,循环条件成立的话,i++要运行的,所以这里,后面一个c=getchar()又要运行一遍),这时,c=getchar(),c的值读下一个,是c=c,
再进行循环条件判断,所以又运行了一下getchar(),顺着往下读取了d,d不等于#,所以输出c的值,输出c,执行c=getchar(),c=e,
再进行循环条件判断,执行getchar()函数,读入了#,因为#=#,所以退出循环。
所以总的输出是ac,没有e。这是没有空格的情况。

在有空格的情况下,是这样的,首先,那个#两边应该是""而不是',因为空格加#是两个字符,不能用'来括。之后,每次作比较的是#这个字符,因为没有任何一个字符可以和“空格#“相等,所以这个循环将一直运行下去,不信你按我说的做,你改成有空格的,然后呢,输入abcde#fhi,它会输出acefh,你输入的越多,它输出的越多,不会有停止的。

明白了没?追问

嗯,我去试了,终于明白了!!哈哈,谢谢了。分已经给人家了不好意思。

第3个回答  2012-10-22
没看到程序?追问

有了现在

追答

你的理解for循环的执行顺序,它是先执行c=getchar();然后执行putchar();再执行c=getchar();
最后执行getchar()!=‘ #’;如此反复,所以只显示奇数位置的的字符。

相似回答