以下代码:
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
调用的结果(按照它在表达式中出现的顺序,而不一定按照它的求值顺序)是第一个<<
'的结果的<<
'(如果您明白我的意思的话)。
所以编译器可以自由地将您的代码翻译成类似于这些(伪中间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 _________|