当你在C++中执行`cout <<"output";`时会发生什么?

1 c++ stream bitwise-operators

我正在尝试理解编译和执行C++代码时真正发生的事情,但这条线cout << "output";让我有些困惑.

我知道<<,运算符是按位的leftshift运算符,并且执行y = x << 6会将值分配给向左y移位x6位的值.

我也知道关于流的'<<'是插入操作符,并且执行cout << "output";将字符串output插入到对象中cout.

我想知道的是,这是否是重载的示例<<,或者是否cout真的被向左移动了一个与字符串占用的位数相对应的值output.如果output真的只是cout通过重载插入<<,那么为什么使用按位运算符而不是赋值运算符=,这会更直观?

问题:如何cout << "output"在终端屏幕上放置"输出"一词?

mjv*_*mjv 7

总之,<<运算符被重载(一种非常常见的c ++特性).
就像其他方法一样,运算符可能会过载,正如Martin York在其响应中暗示的那样,运算符只不过是编译器在解析操作数和运算符表达式时调用的方法.

会发生的情况是,当应用于整数类型的操作数时,这样的<<具有"典型的"按位运算符语义,当应用于流时,它具有"类似printf"的语义.

cout是ostream类型的对象.查看其ostream :: operator <<的详细信息

实际上,对于第二个参数的每个可能类型(在其右侧),ostream :: operator <<被多次过载.这允许馈送具有各种类型的流而不必指定格式.这个运算符返回一个ostream,允许链接几个<<在一起.

为ostream运算符选择<<的原因是允许在行代码中显示与它们在输出中出现的顺序相同的顺序:

  cout << "Found " << nbOfCats << " cats in the " << barnName << "barn.";
Run Code Online (Sandbox Code Playgroud)

这被认为更容易阅读,并且比说的更容易出错

 printf("Found %ld cats in the %s barn.", nbOfCats, barnName);
Run Code Online (Sandbox Code Playgroud)