混合的奇怪输出 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);
^------------------^
突出显示的部分是在调用任何函数之前必须计算的表达式。
我的假设 - 第 3 行中的括号使cout<<"@"
首先执行,这将@
放在行的开头。 然后执行cout.operator<<("!")
,将!
放置到位。 然后cout.operator<<("!")
返回的ostream
运行其operator<<()
,给定cout<<"@"
返回的ostream
,从而输出0x601068
。
如果你理解第二行,为什么第三行会让你感到困惑?
首先,计算括号中的表达式(但未指定计算顺序(,因此@
写在标准输出上;这样的表达式返回对cout
的引用,就像插入运算符一样,否则它们无法链接。
现在计算了表达式的这一部分,一切都照常进行:行上的内容从左到右写:首先是!
,然后是括号中表达式返回的值(即对cout
的引用,然后是endl
。
- std::cout.imbue()多重调用
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- std::cout输出int时出现编译错误
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- main() 中的 std::cout 在调试期间不会在调试控制台中打印任何内容
- std::cout 来自多个线程
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- Cuda 基本程序 (将值写入矩阵和 std:cout 不起作用) ;主功能不启动
- 是否可以为 std::cout 创建别名?
- std::cout 在打印变量与函数表达式时的行为不同
- 带有 std::cout 的多线程控制台文本动画
- 捕获/禁止发送到 std::cout 的 OpenCV 警告
- printf() 和 std::cout 在指针方面的区别
- 使用字符串流加速 std::cout 日志记录
- 是否可以在每次使用std::cout时执行一个函数
- 为什么'std::cout << !+2 '输出 0?
- 如何将自定义类传递给std::cout
- 对于输出,std::copy是否比std::cout快