以下代码:
myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue() << myQueue.dequeue();
Run Code Online (Sandbox Code Playgroud)
将"ba"打印到控制台
而:
myQueue.enqueue('a');
myQueue.enqueue('b');
cout << myQueue.dequeue();
cout << myQueue.dequeue();
Run Code Online (Sandbox Code Playgroud)
打印"ab"为什么会这样?
似乎cout首先调用最外层(最接近;)函数并且正在进行中,它的行为方式是什么?
CB *_*ley 30
<<运算符没有序列点,因此编译器可以自由地dequeue首先评估任一函数.保证的是第二次dequeue调用的结果(按照它在表达式中出现的顺序而不一定是它被评估的顺序)是<<' 第一次调用的结果<<'(如果你得到了我的话)我在说.
因此编译器可以自由地将您的代码转换为某些内容(伪中间c ++).这不是一个详尽的清单.
auto tmp2 = myQueue.dequeue();
auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;
Run Code Online (Sandbox Code Playgroud)
要么
auto tmp1 = myQueue.dequeue();
auto tmp2 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
tmp3 << tmp2;
Run Code Online (Sandbox Code Playgroud)
要么
auto tmp1 = myQueue.dequeue();
std::ostream& tmp3 = cout << tmp1;
auto tmp2 = myQueue.dequeue();
tmp3 << tmp2;
Run Code Online (Sandbox Code Playgroud)
这是临时表在原始表达式中对应的内容.
cout << myQueue.dequeue() << myQueue.dequeue();
| | | | |
| |____ tmp1 _____| |_____ tmp2 ____|
| |
|________ tmp3 _________|
Run Code Online (Sandbox Code Playgroud)
来自你的例子的电话:
cout << myQueue.dequeue() << myQueue.dequeue();
Run Code Online (Sandbox Code Playgroud)
通过两次operator<<函数调用转换为以下表达式:
operator<<( operator<<( cout, myQueue.dequeue() ), myQueue.dequeue() );
-------------------- 1
---------2
Run Code Online (Sandbox Code Playgroud)
评价的顺序cout,myQueue.dequeue()是不确定的.但是,operator<<函数调用的顺序已明确指定,标记为1和2
| 归档时间: |
|
| 查看次数: |
3895 次 |
| 最近记录: |