为什么用于cout和cin的按位移位(<<和>>)?

Cro*_*tar 66 c++ io operators

问题确实在标题中; 我确信有一些合乎逻辑的东西,但是现在我很难过!

Jer*_*fin 60

根据C++的设计和演变 §8.3.1 :

Doug McIlroy通过类比UNIX shell中的I/O重定向运算符(>,>>,|等)提出了提供输出运算符而不是命名输出函数的想法.

[...]

几个运算符被考虑用于输入和输出操作:"赋值运算符是输入和输出的候选者,但它以错误的方式绑定.这cout=a=b将被解释为cout=(a=b),并且大多数人似乎更喜欢输入运算符与操作员<和操作员>都被尝试了,但是"小于"和"大于"的含义如此牢固地植入人们的脑海中,以至于新的I/O语句出于所有实际目的是不可读的(这似乎不是对于<<和>>的情况.除此之外,在大多数键盘上,'<'就在','之上,人们正在写这样的表达式:

cout < x , y, z;
Run Code Online (Sandbox Code Playgroud)

为此提供好的错误消息并不容易.


Abe*_*ker 17

也许是因为它看起来类似于Unix追加操作,因为你基本上是附加到输入/输出流?

例如

产量

echo "foo" >> bar

输入

sendmail -f test@domain.com << myemail.txt

(从Zac Howland窃取输入示例)


Umm*_*mma 11

来自"The C++ Programming language".Stroustrup(语言作者)的话:

将运算符重载为<<''put to''可以提供更好的表示法,并让程序员在单个语句中输出一系列对象.

但为什么<<呢?不可能发明一个新的词法标记.赋值运算符是输入和输出的候选者,但大多数人似乎更喜欢使用不同的运算符进行输入和输出.而且,=以错误的方式绑定; 也就是说,cout = a = b表示cout =(a = b)而不是(cout = a)= b.我尝试了运营商<>,但平均'小于""和""大于'是如此坚定地植入人们的思想,新的I/O声明是为不可读所有的实际目的.


Ela*_*fer 6

>>并且<<只是操作员,您可以实现自己的>><<您的类.

我认为"某人"选择它们是因为:a)它们类似于shell文件操作,b)重用现有的操作符,因为不需要创建新的操作符


650*_*502 6

因为他们或多或少有一个合理的优先权,看起来很好.在C++中,您无法创建新的运算符或更改其优先级或分组规则,您只能重载现有的运算符并更改它们实际执行的操作.

选择<<并且>>有一些不幸的副作用,因为它以某种方式推动输出将完成尊重订单的想法.虽然这对于实际输出来说是正确的,这要归功于一个巧妙的链接技巧,但是对于所涉及的计算来说却是错误的,这通常是令人惊讶的.

更具体的写作

std::cout << foo() << bar() << std::eol;
Run Code Online (Sandbox Code Playgroud)

并不意味着foo之前会被召唤bar.

  • @JamesKanze:这个评论听起来很可笑(请记住,你在谈论一个像`setw`和`setfill`这样的恐怖图书馆). (2认同)

Fed*_*oca 5

所以你要记住,如果你认为cin键盘和cout显示器,你键入的内容会变成变量

cin>>var;
Run Code Online (Sandbox Code Playgroud)

或者变量的内容进入屏幕

cout<<var;
Run Code Online (Sandbox Code Playgroud)