为什么在cout和cin中使用位移运算符(<<和>>)?

88

问题就在标题中;我确定有一个逻辑性的解释,但现在我却被难住了!


12
我认为这是因为它们类似于箭头,暗示某种物质的流动方向。 - Pointy
2
只是猜测,但我想这是因为你正在从文件中“移入”或“移出”数据。 - Mark Ransom
9
为了完整起见:在这个上下文中,它们被称为插入运算符:http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/ - ChristopheD
7
@Pointy: read()write() 这样的函数怎么处理?我认为用户自定义运算符应该具有与内置运算符类似的语义,例如 + 可以用于添加复数或几何向量。但是 ostream::operator<< 与位移操作无关。一些早期的 C++ 设计决策现在被认为存在问题,例如自动生成复制构造函数如果存在析构函数,则不一定需要在 operator<< 的选择中体现出逻辑相关性。 - Philipp
1
@Crowstar:我可以反问一下吗?为什么要使用插入和提取运算符进行位移操作?个人更喜欢使用流进行位操作 ;) - Matthieu M.
显示剩余8条评论
13个回答

1
Bjarne选择它们是因为实用性、关联性和助记价值。
优先级并不完美,例如布尔和位级运算符有些棘手。
但它还是相当不错的。

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 

<< 运算符将其后面的数据插入到其前面的流中。在上面的示例中,它将常量字符串“Output sentence”、数值常量120和变量x插入到标准输出流cout中。

标准输入设备通常是键盘。在C++中处理标准输入是通过在cin流上应用重载的提取运算符(>>)来完成的。该运算符必须跟随将存储从流中提取的数据的变量。例如:

int age;
cin >> age;

0

我假设你知道C++允许运算符重载。通常,只有在语义完全可转移的情况下才会重载运算符(例如,为向量类重载加法以将两个向量相加)。我认为你的问题是关于为什么要使用位移运算符,重载它们用于iostream,并赋予它们完全不同于原始目的的含义。之所以可以这样做,是因为位移操作与iostreams的功能相差甚远,没有人会混淆<<或>>是否对iostream进行位移。而且它们方便使用的原因也是因为它们的顺序是先评估左边的操作数,然后是右边的操作数,再执行操作。当您使用运算符从iostream中附加或提取内容时,这符合您想要发生的情况。

但是,对于最初的问题,为什么?我真的不知道,对我来说,<<和>>似乎很容易理解,它们将信息从一个实体中取出并放入另一个实体中。为什么原因需要比这更复杂?使用它们看起来很明智,因为它们的含义是显而易见的...你还能要求运算符更好的含义吗?


4
<<>> 操作符左右两边的执行顺序不能保证。有时候人们会写类似于 s << foo() << bar() 的代码,并期望先调用 foo 函数再调用 bar 函数,这种情况可能会导致 bug 的出现。但是可以保证的是,foo 函数的结果会在 bar 函数的结果之前被发送到流中,但计算顺序是不确定的。只有 ,||&& 二元操作符提供了这样的保证... 而且这种保证仅在你没有重载它们的情况下才存在。 - 6502

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接