这应该跟你的ch没有正确赋初值有关。如果没有第一处的getchar,ch就没有初值。那么它有可能是任何值。但正好是‘#’的概率很低,因此会进入循环体内部,执行一次putc和putchar。如果想要区分这句语句存在与否究竟会带来什么样的差别,至少应该为ch赋个初值后再测试一次。
所给图示中的红线处的这一行,是因为scanf语句中键盘输入的回车存在于缓存中造成的。而getch正好把缓存中的回车清除了。