表达式基础——引入
表达式由一个到多个操作数组成,可以求值并通常会返回求值结果
通常包含操作符
表达式基础——左值与右值
传统区分:按照等号划分。C++中不这么区分,比如const int不能放在等号左边
值类别:
-泛左值glvalue。求值确定一个对象、位域或函数个体。
-纯右值prvalue。用于初始化对象或作为操作数
-亡值xvalue。泛左值,其包含的资源可以重新使用
左值与右值的转化
- 左值临时转化为右值
- 临时具体化
再论decltype
- 亡值 T&&
- 左值 T&
- 右值 T
类型转换
隐式类型转换:不是什么东西都能转换。比如字符串和float。
数值提升:内存小的转换为内存大的,在数值上无损。
数值转换:可能有数值损失。
显示类型转换:static_cast<double>(3) + 0.5。等价于3+0.5
const_cast<> 可以去除常量性,不安全
reinterpret_cast 对一块内存重新解释,但是也有限制
C类型的转换,直接(新类型),可能会出问题
算术操作符
一元与二元的加减乘除。
一元+x、-x。优先级最高
二元x+y,x-y
均为左结合。
整数相除产生整数,向0取整
求余只能接受整数类型
逻辑与关系操作符
逻辑:与或非。非零int转换为bool值都是true。逻辑短路,与操作先算左边。左边是0就不算右边的
关系:<=>。能比较算术或者指针的大小,不能串联比如a>b>c。C++里面有<=>操作符。
比如 res = (a <=>b),可以做到一次判断,C++20才有的。
操作数和结果均为右值。
位操作符
接受右值,进行位运算,返回右值
除了取反均是左结合
位操作时候会有类型提升,把char变成int
没有短路逻辑
一定情况下等价于乘以或除以2的幂,但是效率更高
赋值操作符
左操作数是可以修改的左值 ;右操作数为右值,可以转换为左操作数的类型
赋值操作符是右结合的
求值结果为左操作数。(x=5)=2...因为x=5的返回值是x,所以最后是给x赋2
小心区分=与==
自增与自减运算符
++;--
分为a++/a--或者++a/--a
比如y = ++x,x会跟着+1,y=x++,x不加y会加
操作数为左值,前缀时候返回左值,后缀时候返回右值
其他操作符
-成员访问操作符.
str a
a.x
操作数什么值,就返回相应左值或者右值
-条件操作符 true ? 3 : 5
第一个操作数是bool(先求值),根据真或者假。:前面是真,后面是假,是哪个就执行哪个,但是后两个的类型必须相同
-逗号操作符
(2,3,4,5)返回最后一个值