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
cout
, myQueue.dequeue()
的评估顺序是未指定的。 但是, operator<<
函数调用的顺序是很好的规定,用1
和2
标记