cout <<打印函数的调用顺序?

下面的代码:

myQueue.enqueue('a'); myQueue.enqueue('b'); cout << myQueue.dequeue() << myQueue.dequeue(); 

打印“ba”到控制台

而:

 myQueue.enqueue('a'); myQueue.enqueue('b'); cout << myQueue.dequeue(); cout << myQueue.dequeue(); 

打印“ab”这是为什么?

似乎cout正在调用最靠外的函数(最接近这个函数)并且正在工作,它的行为方式是什么?

<<运算符没有序列点,因此编译器可以自由地首先评估dequeue函数。 保证的是第二次dequeue调用的结果(按照出现在expression式中的顺序,而不一定是它被评估的次序)被<< <<第一次出现如果你明白我的意思)。

所以编译器可以自由地把你的代码翻译成任何这些东西(伪中间的c ++)。 这并不是一个详尽的清单。

 auto tmp2 = myQueue.dequeue(); auto tmp1 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; tmp3 << tmp2; 

要么

 auto tmp1 = myQueue.dequeue(); auto tmp2 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; tmp3 << tmp2; 

要么

 auto tmp1 = myQueue.dequeue(); std::ostream& tmp3 = cout << tmp1; auto tmp2 = myQueue.dequeue(); tmp3 << tmp2; 

以下是原始expression式中对应的临时对象。

 cout << myQueue.dequeue() << myQueue.dequeue(); | | | | | | |____ tmp1 _____| |_____ tmp2 ____| | | |________ tmp3 _________| 

来自你的例子的电话:

 cout << myQueue.dequeue() << myQueue.dequeue(); 

通过两次调用operator<< function来转换为以下expression式:

 operator<<( operator<<( cout, myQueue.dequeue() ), myQueue.dequeue() ); -------------------- 1 ---------2 

coutmyQueue.dequeue()的评估顺序是未指定的。 但是, operator<<函数调用的顺序是很好的规定,用12标记