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


慕雪6442864
浏览 569回答 3
3回答

RISEBY

没有序列点<<运算符,因此编译器可以自由计算dequeue功能优先。保证的是第二个dequeue调用(按它出现在表达式中的顺序,而不一定是计算它的顺序)<<根据…的结果<<(如果你明白我的意思)。所以编译器可以自由地将您的代码转换成任何东西(伪中间的c+)。这并不是一个详尽的清单。auto&nbsp;tmp2&nbsp;=&nbsp;myQueue.dequeue();auto&nbsp;tmp1&nbsp;=&nbsp;myQueue.dequeue();std::ostream&&nbsp;tmp3&nbsp;=&nbsp;cout&nbsp;<<&nbsp;tmp1;tmp3&nbsp;<<&nbsp;tmp2;或auto&nbsp;tmp1&nbsp;=&nbsp;myQueue.dequeue();auto&nbsp;tmp2&nbsp;=&nbsp;myQueue.dequeue();std::ostream&&nbsp;tmp3&nbsp;=&nbsp;cout&nbsp;<<&nbsp;tmp1;tmp3&nbsp;<<&nbsp;tmp2;或auto&nbsp;tmp1&nbsp;=&nbsp;myQueue.dequeue();std::ostream&&nbsp;tmp3&nbsp;=&nbsp;cout&nbsp;<<&nbsp;tmp1;auto&nbsp;tmp2&nbsp;=&nbsp;myQueue.dequeue();tmp3&nbsp;<<&nbsp;tmp2;这里是临时代表在原始表达式中对应的内容。cout << myQueue.dequeue() << myQueue.dequeue();|&nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|&nbsp; &nbsp; |&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;||&nbsp; &nbsp; &nbsp; &nbsp;|____ tmp1 _____|&nbsp; &nbsp; |_____ tmp2 ____||&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;||________ tmp3 _________|

倚天杖

您的例子中的调用:cout&nbsp;<<&nbsp;myQueue.dequeue()&nbsp;<<&nbsp;myQueue.dequeue();的两个调用转换为下面的表达式operator<<职能:operator<<(&nbsp;operator<<(&nbsp;cout,&nbsp;myQueue.dequeue()&nbsp;),&nbsp;myQueue.dequeue()&nbsp;);--------------------&nbsp;1---------2评价顺序cout,&nbsp;myQueue.dequeue()没有具体说明。然而,operator<<函数调用被很好地指定,如1和2

神不在的星期二

自C+17以来,此代码的行为发生了变化;<<的右操作数之前排序。<<,即使是重载的操作符也是如此。输出现在必须是ab.详情请参阅:C+17引入的评估顺序保证是什么?.
打开App,查看更多内容
随时随地看视频慕课网APP