繁体   English   中英

混合std :: cout的奇怪输出

[英]Strange outputs of mixed up std::cout

C ++的std :: cout似乎很有趣。 我今天在C ++编译器上尝试了以下程序:

cout<<"!"<<"@"<<endl;
cout<<"!"<<cout<<"@"<<endl;
cout<<"!"<<(cout<<"@")<<endl;

输出非常奇怪:

!@
!0x601068@
@!0x601068

第一行是行人;第二行是行人。 第二个是可以理解的; 但是,第三行是我所不知道的。 有人可以解释输出吗? 谢谢大家!

子耀伟

这行:

cout<<"!"<<(cout<<"@")<<endl;

它首先执行:

(cout << "@")

注意:它可能首先执行了其他操作,但是编译器优化了该子表达式,发现它可以将其移动到语句的开头而不会破坏任何约束。

该表达式的结果是流(cout)。 因此,结果表达式为:

cout<<"!"<< cout <<endl;

结果是:

@!<pointer>

括号会像其他表达式一样影响此处的求值顺序(<<是运算符)。 因为该表达式具有副作用 ,所以这些副作用的发生顺序与表达式评估的顺序相同。

第三行说明了作为插入运算符的语法糖。

本质上,首先计算(cout<<"@")表达式,导致@ ,它返回流cout本身。

只有这样! 首先,将表达式发送到cout

其等效于:

operator<<( operator<<( operator<<(cout,"!"), ( operator<<(cout,"@") ) ), endl);
                                                ^------------------^

突出显示的部分是一个表达式,必须在调用任何函数之前对其求值。

我的假设-第三行中的括号使cout<<"@"首先执行,这会将@放在行的开头。 然后执行cout.operator<<("!") ,将! 到位。 然后, cout.operator<<("!")返回的ostream运行其operator<<() ,该operator<<()被赋予cout<<"@"返回的ostream ,从而输出0x601068

如果您理解第二行,那么为什么第三行会使您感到困惑?

首先,对括号中的表达式进行求值(但求值顺序未指定),因此@会写在标准输出上; 此类表达式返回对cout的引用,就像插入操作符总是会发生的那样,因为否则它们将无法链接。

现在已经评估了表达式的这一部分,一切都照常进行:从左到右依次写出行中的内容:首先是! ,然后从括号中的表达式返回的值(即对cout的引用,然后对endl的引用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM