为什么程序不执行最终的printf语句?

我无法弄清楚为什么程序控制没有到达第三个printf,就在for循环之后。

为什么不打印第三张printf

如果我将for循环更改为while循环,它仍然不会打印。

这是程序和输出:

 main() { double nc; printf ("Why does this work, nc = %f\n", nc); for (nc = 0; getchar() != EOF; ++nc) { printf ("%.0f\n", nc); } printf ("Why does this work, nc = %f", nc); } 

输出是:

 Why does this work, nc = 0.000000 test 0 1 2 3 4 

它对我来说很好,你是如何试图终止该程序的? 一旦EOFgetchar()检测为输入, for -loop就应该结束。

EOF是Windows下的Control-Z^Z )和Linux / Unix下的Control-D^D )。 一旦我输入它,循环终止,我得到最后的printf()来显示其输出。

作为最后一点(正如@DanielFisher所提到的那样),在最后的printf()调用结束时添加'\n' ,因为您的特定实现可能需要它,否则程序的行为可能是未定义的(感谢@ KeithThompson和@AndreyT在评论中指出了这一点:

  printf ("Why does this work, nc = %f\n", nc); 

printf是缓冲的,这就是为什么最后一行可能不会显示的原因。 这意味着对printf的调用可能不会导致直接输出,因为函数在将数据放入输出(您的终端)之前会累积数据。

在最后一次printf之后调用fflush会将剩余的所有内容都放在终端中。 此外,每次请求换行时都会刷新缓冲区。