提问者:小点点

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在调用最外层(最接近;)函数优先,它的工作方式,这是它的行为方式吗?


共1个答案

匿名用户

<<运算符没有序列点,因此编译器可以自由地首先计算dequeue函数。可以保证的是,第二个dequeue调用的结果(按照它在表达式中出现的顺序,而不一定按照它的求值顺序)是第一个<<'的结果的<<'(如果您明白我的意思的话)。

所以编译器可以自由地将您的代码翻译成类似于这些(伪中间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;

下面是在原始表达式中,临时词所对应的。

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