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

时间:2011-01-31 17:53:45

标签: c++ io operators

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

13 个答案:

答案 0 :(得分:57)

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

  

Doug McIlroy建议提供输出运算符而不是命名输出函数的想法,类似于UNIX shell中的I / O重定向运算符(>,>>,|等)

[...]

  

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

cout < x , y, z;
     

要为此提供良好的错误消息并不容易。

答案 1 :(得分:16)

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

E.g。

输出

echo "foo" >> bar

输入

echo "foo" >> bar

(从Zac Howland窃取输入示例)

答案 2 :(得分:10)

来自“C ++编程语言”。 Stroustrup(语言作者)的话:

  

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

     

但为什么<<?不可能发明一个新的词法标记。赋值运算符是输入和输出的候选者,但大多数人似乎更喜欢使用不同的运算符进行输入和输出。此外,=以错误的方式绑定;也就是说,cout = a = b表示cout =(a = b)而不是(cout = a)= b。我尝试了运算符<>,但是“小于”和“大于”的平均值如此牢固地植入人们的脑海中,以至于新的I / O语句适用于所有实际操作目的不可读。

答案 3 :(得分:6)

>><<只是运算符,您可以为您的类实现自己的>><<

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

答案 4 :(得分:5)

所以你要记住,如果你认为cin是一个键盘而cout是一个监视器,你输入的内容会变成变量

cin>>var;

或者您的变量内容转到屏幕

cout<<var;

答案 5 :(得分:5)

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

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

更具体的写作

std::cout << foo() << bar() << std::eol;

并不意味着foo之前会调用bar

答案 6 :(得分:3)

它们不是按位运算符,在此上下文中称为插入和提取运算符。

http://www.cplusplus.com/doc/tutorial/basic_io/

这些仅用于视觉解释。如果你研究开发自己的流和运算符重载,那么你可以看到你甚至可以使用+作为输入和 - 输出:)

答案 7 :(得分:3)

这个答案令人不满意但是正确:它们不是按位运算符。

运算符的含义由左侧显示的数据类型决定。在cin和cout(以及其他流类型)的情况下&lt;&lt;和&gt;&gt;运算符将值移入和移出流。在左操作数是整数的情况下,操作是您从C中已知的按位操作。

运算符的含义并不固定,尽管它的优先级是。

答案 8 :(得分:3)

主要是因为他们的相关性。插入和提取操作符从左到右关联,所以

std::cout << "Hello" << ' ' << 4 << 2;

按照您的预期进行评估:先使用"Hello",然后使用' ',最后使用42进行评估。当然,加法运算符operator+也从左到右关联。但是那个操作员和其他具有从左到右关联性的人已经有了不同的含义。

答案 9 :(得分:1)

Bjarne选择了他们的实用优先级,关联性和助记符值。

优先权并不完美,例如布尔和位级运算符很麻烦。

但是相当不错。

答案 10 :(得分:1)

插入运算符>><<分别与输入流和输出流一起使用,因为输入流 表示数据流入程序,输出流表示数据流出程序。 由于这些插入操作符看起来像Directional操作符(显示数据流的方向), 因此,为输入流选择>>,为输出流选择<<

看一下代码的一部分......

int Num1;
cin >> Num1;

这里如果你仔细观察>>显示数据流到变量(在程序中声明) 这意味着数据流向程序,这是输入流的作业(此处为cin)。

同样适用于cout

int Num2 = 5;
cout << Num2;

这里<<显示程序中的数据流(因为Num2是程序的一部分),这是输出流的工作。

我希望这一切对你有意义。

答案 11 :(得分:0)

cout << "Output sentence"; // prints Output sentence on screen
cout << 120;               // prints number 120 on screen
cout << x;                 // prints the content of x on screen 

&lt;&lt;运算符将其后面的数据插入到它之前的流中。在上面的例子中,它将常量字符串Output语句,数值常量120和变量x插入到标准输出流cout中。

标准输入设备通常是键盘。在C ++中处理标准输入是通过在cin流上应用提取的重载操作符(&gt;&gt;)来完成的。操作符后面必须跟有将存储将从流中提取的数据的变量。例如:

int age;
cin >> age;

答案 12 :(得分:0)

我假设你知道C ++允许运算符重载。通常,只有在语义完全可转移时才重载运算符(例如,重载向量类的加法以将两个向量相加在一起)。我认为你的问题是为什么人们会使用bitshift运算符,为了iostream重载它们,并给它们一个与它们最初目的完全不同的含义。它可以完成的原因是因为比特移位操作远离iostream所做的那样,没有人会混淆思考&lt;&lt;或&gt;&gt;正在对iostream进行一次移位。而且它们使用方便的原因还在于它们的排序是首先评估左边的操作数,然后是右边的操作数,然后进行操作。当你使用运算符从iostream中追加或提取东西时,这符合你想要发生的事情。

但是,对于原始问题,为什么?我真的不知道,在我看来就像&lt;&lt;和&gt;&gt;非常容易理解为从一个实体获取信息并将其放入另一个实体。为什么原因需要比那更复杂?使用它们看起来很明智,因为它们的含义是显而易见的。你能对操作员有什么好处?

相关问题