为什么 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 首先调用最外层(最接近 ;) 函数并按其方式工作,这是它的行为方式吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
<<
运算符没有序列点,因此编译器可以首先评估任一dequeue
函数。可以保证的是,第二个dequeue
调用的结果(按照它在表达式中出现的顺序,而不一定是它的求值顺序)是<<< /code>' 为
<<
' 第一个的结果(如果你明白我的意思)。所以编译器可以自由地将你的代码翻译成类似这些的东西(伪中间c++)。这并不是一份详尽的清单。
or
or
这是临时变量在原始表达式中对应的内容。
There's no sequence point with the
<<
operator so the compiler is free to evaluate eitherdequeue
function first. What is guaranteed is that the result of the seconddequeue
call (in the order in which it appears in the expression and not necessarily the order in which it is evaluated) is<<
'ed to the result of<<
'ing the first (if you get what I'm saying).So the compiler is free to translate your code into some thing like any of these (pseudo intermediate c++). This isn't intended to be an exhaustive list.
or
or
Here's what the temporaries correspond to in the original expression.
示例中的调用:
转换为以下表达式,其中两次调用
operator<<
函数:cout
、myQueue.dequeue() 的求值顺序
未指定。但是,operator<<
函数调用的顺序已明确指定,如1
和2
标记The call from your example:
translates to the following expression with two calls of
operator<<
function:The order of evaluation of
cout
,myQueue.dequeue()
is unspecified. However, the order ofoperator<<
function calls is well specified, as marked with1
and2
自 C++17 起,此代码的行为发生了变化;
<<
的左操作数在<<
的右操作数之前排序,即使它是重载运算符也是如此。现在输出必须是ab
。如需进一步阅读,请参阅:C++17 引入的求值顺序保证是什么?。
Since C++17 the behaviour of this code has changed; the left operand of
<<
is sequenced before the right operand of<<
, even when it is an overloaded operator. The output must now beab
.For further reading see: What are the evaluation order guarantees introduced by C++17?.