请问大神为什么这个C语言程序运行结果是13?我怎么觉得是12345?求大神解释,这是怎么运行的?

问题描述:

#include
#include

int main(void)
{
char c;
for(c=getchar();getchar()!='#';c=getchar())
putchar(c);
}图片说明

执行情况是这样的:
首先执行getchar()得到'1';
然后执行getchar()得到'2',判断不等于'#',执行putchar(c),输出‘1’;
然后执行c=getchar()得到'3';
然后执行getchar()得到'4',判断不等于'#',执行putchar(c),输出‘4’;
然后执行c=getchar()得到'5'
然后执行getchar()得到'#',判断等于'#',结束循环。

答案给的是135,不明白为什么?

c=getchar();读取1
getchar()读取2,判断不等于#
打印1
然后读取3
在读取4判断不等于#
打印3
在读取5
读取#判断循环结束

整个过程捋了下,大概是这样
改成for(c=getchar();c!='#';c=getchar())就没问题

在for循环的条件表达式中做循环判断是指针就移位

getchar()用重复了

char c;实际对应的数字啊 几个数字之和就是13了。

关键代码如下:
for(c=getchar();c!='#';c=getchar())
putchar(c);

getchar()读取键入数据
for里面就有三个
第一个赋值给c
中间判断!+"#"的那个getchar()已经不是1了,而是读取的新键入得值
然后第三个getchar()重新赋值给c,此时对应键入的值是3了已经。

依次推类
for循环第一个是初始化,中间的是判断条件,每次都会执行。后面的是执行完循环体后执行的表达式。
就是说除了第一次c=getcher()后

假设你的输入为1234567........#
第一次执行for
c=getcher() //1
getcher()!="#" //2!="#"
putchar(c); //输出c,此时c为1
c=getcher() //3

第二次执行
getcher()!="#" //4!="#
putchar(c); //此时c=3
c=getcher() //5

第三次执行
getcher()!="#" //6!="#"
putchar(c); //5,因为此时c为5,在上一次for结束时执行表达式赋值的
c=getcher() //7

.....
当读取到#
这一步判断"#"!="#"不成立,这时不执行循环体了,就是说此时的putchar(c);不会执行

以后就是这样