preface
本文是对一个学弟提问的问题的解释,主要涉及C++运算符重载和运算符优先级别的知识。
问题
输出34-32||0&&1;
结果是2(34-32||0&&1);
结果是1
为啥😮
即1
2
3
4
5
6cout<<34-32||0&&1<<endl;
cout<<(34-32||0&&1)<<endl;
## 结果
2
1
辅助分析示例子
1 | cout<<a=100; |
分析
先明确下,以下几个运算符的优先级别
1 | # 优先级别从高到低排列,同行的运算符,优先级别相同 |
这里直接给出解释了
重载运算符不能改变原有运算符的优先级, 结合性和操作数个数.
<< >>
被重载为流提取运算符
cout<<a
<<
左侧cout
是一个ostream
对象,右侧就是你的表达式之类的,前面说的cout<<a=100;
会报错是因为,重载的operator<<()
函数返回的是一个指向ostream
对象的引用
比如cout<< a <<b;
cout<<a
本身就是ostream
对象cout
,将一个值直接赋值给一个对象肯定错了。加上括号过后,改变了运算顺序,cout<<100;
,也就是对的
最开始提到的cout<<34-32||0&&1;
一开始执行的是cout<<34-32
输出了一个2,然后返回了一个cout对象
也就是看作 cout || 0 && 1
,但是这个表达式已经和我们无关了,因为没有流提取符 把它们输出了
如果你执行 cout<<(cout<<34-32||0&&1);
会输出21 ,因为一开始输出了2, cout || 0 && 1
这个式子为1(短路),再输出1,也就是21
举个例子cout<<(cout || 0);
输出就是1