6
#include <iostream>                                                             

using namespace std;

int main()
{
   cout << 1;
   while (true);
   return 0;
}

我认为这个程序应该打印 1 然后挂起。但它不打印任何东西,它只是挂起。 cout << endl或者cout.flush()可以解决这个问题,但我仍然想知道为什么它没有按预期工作:) 这个问题出现在codeforces比赛期间,我花了很多时间来查看我的程序的奇怪行为。不正确,它也挂了,隐藏的输出实际上是调试信息。

我尝试使用printf(compile with gcc) 并且它的行为也一样好cout,所以这个问题也可以参考 C。

4

3 回答 3

8

您写入缓冲区。您需要刷新缓冲区。正如@Guvante 提到的,使用cout.flush()fflush(stdout)用于printf。

更新:

看起来fflush实际上适用于 cout。但是不要那样做——这可能不是所有情况下的事实。

于 2013-08-09T20:01:16.613 回答
2

那是因为cout缓冲区输出。您必须刷新缓冲区才能实际打印。

endl并且flush()都执行此冲洗。

另请注意,您的程序挂起是因为您有一个无限循环 ( while(true);)。

它这样做的原因是,如果您要打印大量数据(例如 1000 个数字),它可以更有效地执行此操作。此外,大多数次要数据点都以无论如何结尾endl,因为您希望输出跨越多行。

于 2013-08-09T20:01:40.437 回答
1

关于printf,与cout持有相同:您正在打印到缓冲区中,您需要使用fflush(stdout);. 终止将刷新缓冲区,这就是为什么您可以在没有无限循环的情况下看到输出的原因。

请参阅为什么 printf 在调用后不刷新,除非换行符在格式字符串中?了解更多信息。

于 2013-08-09T20:16:08.740 回答