为什么不能在流中直接使用按位运算符?

时间:2016-11-12 14:05:52

标签: c++ operator-overloading operators

尝试运行此代码时

#include <iostream>
using namespace std;
int main() {
  short int a = 0xFFFD, b = 10;
  cout <<  a | b;
  return 0;
}

我收到了错误

  

错误:不匹配&#39;运算符|&#39;

但是,将结果存储在另一个变量中似乎可以解决问题:

#include <iostream>
using namespace std;
int main() {
  short int a = 0xFFFD, b = 10, c;
  c = a | b;
  cout << c;
  return 0;
}

有人能解释我为什么吗?

2 个答案:

答案 0 :(得分:3)

问题是按位运算符|与移位运算符相比,优先级较低。

因此这句话

cout <<  a | b;

等同于语句

( cout <<  a ) | b;

并且没有重载运算符|对于std::osteram

类型的左操作数

答案 1 :(得分:3)

cout <<  a | b;

这相当于:

(cout << a) | b;

如果您阅读了其余的错误消息,那么您会发现它没有告诉您operator|(ostream&, short int),这是真的。

通过将parens放在适当的位置来修复你的表达:

cout << (a | b);

(在其自己的变量中预先存储a | b具有类似的效果。)

是的,这在这里不直观,但那是因为<<已被重复使用&#34;从它的基本含义&#34;按位左移&#34;,由于该基数意味着最初确定|优先级低于<<