【问题标题】:Why can't bitwise operators be used directly in stream?为什么不能在流中直接使用位运算符?
【发布时间】:2016-11-12 14:05:52
【问题描述】:

在尝试运行此代码时

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

我遇到了一个错误

错误:'operator|' 不匹配

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

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

谁能解释一下为什么?

【问题讨论】:

标签: c++ operator-overloading operators


【解决方案1】:
cout <<  a | b;

这相当于:

(cout << a) | b;

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

通过将括号放在适当的位置来修复您的表达式:

cout << (a | b);

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

是的,这是不直观的,但这是因为 &lt;&lt; 已从其基本含义“按位左移”中“重新使用”,并且由于该基本含义,最初决定 |优先级低于&lt;&lt;

【讨论】:

    【解决方案2】:

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

    所以这个说法

    cout <<  a | b;
    

    等价于语句

    ( cout <<  a ) | b;
    

    并且没有重载运算符 |对于std::osteram 类型的左操作数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-12
      • 2020-06-23
      • 1970-01-01
      • 2020-08-31
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多