在C++中,cout
和 cerr
是两种不同的输出流,它们用于不同的目的。
-
cout
是标准输出流,通常用于输出程序的状态信息、结果等。它是缓冲的,这意味着在达到一定量的数据或者当遇到换行符(例如endl
)时,数据才会被实际写入到输出设备(通常是终端或屏幕)。 -
cerr
是标准错误流,通常用于输出错误信息。它是非缓冲的,这意味着一旦你向cerr
写入数据,它就会立即被发送到输出设备,而不需要等待缓冲区被填满或遇到换行符。
例:
cout << "hi" << endl;
cout << "hi11";
cerr << "error";
这段代码的输出结果将依赖于多个因素,包括操作系统的缓冲区刷新行为和标准输出与标准错误是否被重定向。以下是可能的情况:
-
"hi"
后面跟着endl
,这将导致缓冲区被刷新,所以"hi"
会被立即输出并换行。 -
"hi11"
被写入cout
,但后面没有endl
或其他刷新缓冲区的方法,所以这部分输出可能会留在缓冲区中,等待缓冲区被刷新。 -
"error"
被写入cerr
,因为cerr
是非缓冲的,所以"error"
会立即输出。
输出结果如下:
因为 cerr
的输出不会等待 cout
的缓冲区刷新,这里 cout
的缓冲区在程序结束前没有被刷新,所以 "hi11"
不会显示在输出中。要确保 cout
的内容被输出,可以在程序的末尾添加 std::cout.flush();
或者使用 endl
来刷新缓冲区。
但是,具体的表现可能会因编译器、操作系统和运行环境的不同而有所不同。在某些系统上, "error"
可能会出现在 "hi"
和 "hi11"
之间。
我们在运行结束前添加cout<<endl来刷新缓冲区,则hi11也可以输出
#include <iostream>
using namespace std;
int main()
{
cout<<"hi"<<endl;
cout<<"hi11";
cerr<<"error";
cout<<endl;
}