C++运算符重载

preface

本文是对一个学弟提问的问题的解释,主要涉及C++运算符重载和运算符优先级别的知识。


问题

输出
34-32||0&&1;结果是2
(34-32||0&&1);结果是1
为啥😮


1
2
3
4
5
6
cout<<34-32||0&&1<<endl;
cout<<(34-32||0&&1)<<endl;

## 结果
2
1

辅助分析示例子

1
2
3
4
5
cout<<a=100;
会报错

cout<<(a=100);
输出100

分析

先明确下,以下几个运算符的优先级别

1
2
3
4
5
6
# 优先级别从高到低排列,同行的运算符,优先级别相同
( )(圆括号)
+ (加号) - (减号)
<< (左移) >> (右移)
&& (逻辑与)
|| (逻辑或)

这里直接给出解释了

重载运算符不能改变原有运算符的优先级, 结合性和操作数个数.

<< >> 被重载为流提取运算符


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

关注我的微信公众号[李一二],即时看更多的文章