众所周知,cout是一个流对象,管理一个缓冲区。当使用<<操作符输出字符串时,字符串不是直接被输出到屏幕上,而是首先被插入到该流的缓存(buffer)中。而只有当缓冲区被刷新时,字符串才会显示在屏幕上。
一般来说,有以下几种操作会刷新缓冲区:
- cout被析构
- 缓冲区满
- 使用操纵符主动刷新,例如endl,fflush
- 使用unitbuf操纵符设置流的内部状态,使得每次向流中插入字符都会刷新流
- 使用cin读取字符串
但当测试以下代码时:
#include<iostream>
using namespace std;
int main()
{
cout<<"aaa";
while(1);
return 0;
}
虽然不满足上述操作中的任何一个,但字符串aaa仍被输出。vs,g++上均是如此。
经查找资料了解到:当系统空闲时(还有种说法是长时间无输入时)缓冲区会自动刷新。当然这种刷新只是一种“请求”,并不能保证刷新,会不会刷新完全看系统心情_(:3 」∠)_。
所以,并非未刷新缓冲区就输出了字符串,而是系统比较闲,所以顺手帮你刷新了缓冲区。但要想保证在该输出的地方输出,还是安安心心使用endl或fflush吧。( ̄∇ ̄)