目录
1.表达式基础
1.表达式基础
运算符重载,就是自己定义+ - * / 之类的运算符怎么运算
C++中的左值和右值
C语言左值在左侧,右值在右侧
在cpp中要复杂的多
能取到地址的表达式是左值
不能取到地址的表达式是右值
常量对象为代表的左值不能作为赋值语句的左侧运算对象
const int a=6; a是左值,但是后面a不能出现在左边了
某些表达式的求值结果是对象,但他们是右值
这个很常见的,比如说一个中间变量的表达式是(a+1),但是你不能取它的地址,虽然他是对象但是他是右值
解引用 数组下标[ ]运算 string和vector的下标运算,本质上都是引用,他们是可以当左值的
左值:常量 ,地址
右值:对象 a,指针
如果改变了某个对象的值,在表达式的其他地方不要在用这个对象了,因为用的时候是改变前还是改变后你无从知道,会导致脏读。最好是分开写
逻辑和关系运算符
const和&结合效率比较高,因为&不用拷贝,就是这个东西的别名,const是保证它不被修改的
C++11允许用列表赋值,但是如果发生了窄化转换(会被截断,存在精度的风险,还有不确定左值是否能够放得下(越界与否))的不行
ival=pval=0;右结合律 pval=0先算,pval赋值为null并返回int * 的0 ,而int*的0不能赋值给int
string库里面重载了=的操作符,能让字面常量"OK"转化为string的"OK" 然后返回string的OK给s1赋值
错误点
int arr[ ]={2,1,6,8,10};
int *p=arr;
则*p++为多少?它表示了什么运算?
解:++的优先级比*高,相当于*(p++)所以先++,p确实指向了开头元素的后面,但是的话p++返回的是++之前的数据,所以p++返回的是指向2的指针,在解引用得到的还是2
三木运算符最好整体在外面加个()
位运算符的作用对象是整数的二进制
运算对象如果小于int 则提升为32位的int后再进行运算
用或的方式把某一位置成1,用与的方式把某一位置成0
ret |=(1<<27)
ret &=~(1<<27)
0按位与X 还是0
1按位或X 还是1
查看一下是1 还是0
位移运算符优先级:: 关系运算符(比大小)<位移运算符<算数运算符