为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕雪6442864 2019-07-13 15:33:24
以下代码: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首先调用了最外层(最接近;)的函数,并以自己的方式工作,这是它的行为方式吗?
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

没有序列点<<运算符,因此编译器可以自由计算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 _________|


查看完整回答
反对 回复 2019-07-13
?
倚天杖

TA贡献1828条经验 获得超3个赞

您的例子中的调用:

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

的两个调用转换为下面的表达式operator<<职能:

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

评价顺序coutmyQueue.dequeue()没有具体说明。然而,operator<<函数调用被很好地指定,如12


查看完整回答
反对 回复 2019-07-13
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

自C+17以来,此代码的行为发生了变化;<<的右操作数之前排序。<<,即使是重载的操作符也是如此。输出现在必须是ab.

详情请参阅:C+17引入的评估顺序保证是什么?.


查看完整回答
反对 回复 2019-07-13
  • 3 回答
  • 0 关注
  • 565 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信