C++的std :: cout似乎是一件有趣的事情。今天我尝试了我的C++编译器,下面的程序:奇怪的混合输出std :: cout
cout<<"!"<<"@"<<endl;
cout<<"!"<<cout<<"@"<<endl;
cout<<"!"<<(cout<<"@")<<endl;
,输出相当好奇:
[email protected]
[email protected]
@!0x601068
第一行是行人;第二个是可以理解的;然而,第三条线是我所不了解的。有人可以解释输出吗?谢谢各位提前!
Ziyao Wei
你确定它是一个优化,导致子表达要先发生?我认为这是做到这一点的顺序点。 – quamrana 2011-04-19 21:56:33
在语句的开始和结尾处有一个序列点。每次调用方法前后的序列点(注:operator <<是方法调用)。其他一切都可以移动。这里唯一的限制是''(cout <<“@”)'在用作参数之前必须完全评估。天气是在第一次方法调用之前或之后完成的,取决于编译器正在做什么优化。 – 2011-04-19 23:32:19