** preface **
本文是对一个学弟提问的问题的解释,主要涉及C++运算符重载和运算符优先级别的知识。
** 问题 **
输出34-32||0&&1;
结果是2(34-32||0&&1);
结果是1
为啥😮
即
1 | cout<<34-32||0&&1<<endl; |
辅助分析示例子
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