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

Why can't bitwise operators be used directly in stream?

本文关键字:运算符 不能 为什么      更新时间:2023-10-16

尝试运行此代码

#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;
}
谁能给我解释一下为什么?
cout <<  a | b;

这相当于:

(cout << a) | b;

如果你阅读错误信息的其余部分,你会看到它告诉你没有operator|(ostream&, short int),这是真的。

通过在适当的位置放置父元素来修复表达式:

cout << (a | b);

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

是的,这在这里是不直观的,但这是因为<<已经从它的基础意义"按位左移"中被"重用",并且由于这个基础意义,最初决定|将具有比<<更低的优先级

问题是位运算符|与移位运算符相比具有较低的优先级。

因此这个语句

cout <<  a | b;

等价于语句

( cout <<  a ) | b;

std::osteram

类型的左操作数没有重载操作符|