C++中cout流的输出顺序

先来看一段代码:

#include
using namespace std;
int hello1();
int hello2();
int main()
{
	cout << "a=" << hello1() << endl << "b=" << hello2() << endl;
	return 0;
}

int hello1()
{
	cout << "hello1()" << endl;
	return 1;
}
int hello2()
{
	cout << "hello2()" << endl;
	return 2;
}

我第一次看到这段代码,认为输出的顺序就是:

a=hello1()
b=hello2()

但是真正的运行结果呢,我们来看看:

hello2()
hello1()
a=1
b=2

为什么呢?
因为cout输出时,先从右往左扫描,将数据读入缓冲区,然后再从左往右输出。所以,从右往左读取缓冲区的时候,先遇到函数hello2(),那么先执行函数hello2(),然后将函数的返回值作为数据读取到缓冲区。

也就是说如果我们在输出流中调用子函数的时候,cout在从右往左扫描的时候,一旦遇到子函数,那么它就会立即执行这个子函数,如果子函数中有输出语句,那么程序就会立即执行这个输出语句,然后再将这个子函数的返回值存到数据缓存区中,等到cout流扫描到最左边的时候,再把刚才存到数据缓存区中的数据一并输出,并且输出的顺序是从左往右,这一个特点有点像堆栈中的先进后出的原则。我们需要注意的是,如果我们想在cout输出流中调用子函数的时候,这个被调用的子函数必须是带有返回值的函数,不能是一个无返回值的void类型,比如说如果我们把刚才程序中的一个子函数更改一下,程序机会报错:

#include
using namespace std;
int hello1();
void hello2();
int main()
{
	cout << "a=" << hello1() << endl << "b=" << hello2() << endl;
	return 0;
}

int hello1()
{
	cout << "hello1()" << endl;
	return 1;
}
int hello2()
{
	cout << "hello2()" << endl;
}

C++中cout流的输出顺序_第1张图片
因为在C++中,<< 为插入运算符,它表示把它后面的东西插入到输出流中,它不允许插入一个没有任何东西的量,我们可以插入一个变量、一个字符串或者一个带有返回值的子函数等等。

你可能感兴趣的:(C++)