为什么不能在流中直接使用按位运算符?
Why can't bitwise operators be used directly in stream?
尝试运行此代码
#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
相关文章:
- 取消引用运算符不能重载
- 为什么文本运算符不能正常模板化?
- 不能将重载比较运算符与 Catch 测试一起使用
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 为什么我不能在运算符=中使用引用类型?
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- C++自定义删除运算符不能正常工作?
- 为什么我不能将运算符+与reverse_iterator一起使用?
- 为什么我们甚至需要删除运算符?(我们不能只使用删除[]吗)
- 为什么 test2 + test3 的运算符<<不能过载?
- 二元运算符"<<"不能应用于类型 "wostream" 和 "string" 的表达式
- 运算符<<不能使用其好友数组的 IT 成员
- 为什么重载运算符不能定义为类的静态成员
- 为什么% 运算符不能用于 C/C++ 中的浮点数,但可以在 Java 和 C# 中使用
- 为什么"<<"运算符可以继承,而">>"运算符不能?
- 为什么作者强调运算符[]不能返回0 ?
- 为什么无状态函子的运算符 () 不能是静态的?
- **运算符不能将二维数组作为参数
- 在c++中,不等于(!=)运算符不能正确使用字符