#include <iostream>
using namespace std;
int main()
{
cout << 1;
while (true);
return 0;
}
我认为这个程序应该打印1然后挂起。但它没有打印任何东西,只是挂了。
cout << endl
或cout.flush()
可以解决此问题,但我仍然想知道为什么它没有按预期工作:)
这个问题出现在codeforces比赛期间,我花了很多时间来查看我的程序的奇怪行为。这是不正确的,它也是躲避,隐藏的输出实际上是调试信息。
我尝试使用printf
(使用gcc进行编译),它的行为与cout
一样,所以这个问题也可以引用到C.
答案 0 :(得分:8)
您正在写入缓冲区。您需要刷新缓冲区。正如@Guvante所提到的,使用cout.flush()
或fflush(stdout)
作为printf。
<强>更新强>
看起来fflush
实际上与cout一起使用。但是不要这样做 - 在所有情况下都可能不是这样。
答案 1 :(得分:2)
这是因为cout
缓冲输出。您必须刷新缓冲区才能实际打印。
endl
和flush()
都执行此刷新。
另请注意,您的程序会挂起,因为您有一个无限循环(while(true);
)。
这样做的原因是,如果您要打印大量数据(比如说1000个数字),它可以大大提高效率。此外,大多数次要数据点都以endl
结尾,因为您希望输出跨越多行。
答案 2 :(得分:1)
关于printf
,与cout
相同:您要打印到缓冲区,需要用fflush(stdout);
刷新它。终止将刷新缓冲区,这就是为什么你可以看到没有无限循环的输出。
有关详细信息,请参阅Why does printf not flush after the call unless a newline is in the format string?。