表达式详述
自增与自减运算符
自增与自减运算符:++
,--
,它最基本的含义与x = x +/- 1
等价。在使用自增和自减运算符时我们需要注意以下几点
- 自增和自减运算符分为前缀和后缀两种
int x = 3; int y ; int z ; y = x++; // y = 3,x = 4
y = ++x; // y = 4,x = 4
后缀自增运算符返回x变化之前的值,前缀自增运算符返回x变化之后的值,对于自减运算符也是类似的
- 自增和自减运算符是右结合的
- 自增和自减运算符的操作数为左值,前缀时返回左值,后缀时返回右值(临时对象)
++(++x); // 合法的代码 (x++)++; // 非法的代码
- 使用前缀形式会更加高效,可能的情况下尽量使用前缀形式
其他操作符
除了前面所述的操作符,还有一些其他的操作符
-
成员访问操作符,用于结构体和类中:
.
,->
。关于成员访问操作符我们需要注意以下几点ptr->
等价于(*ptr).
.
的操作数可以是左值也可以是右值,如果操作数是左值则返回左值,如果操作数是右值则返回将亡值struct Str{ int x; } int main(){ Str A; A.x; // 左值 Str().x; // 将亡值 }
->
的左操作数为一个指针,返回值为左值
-
条件操作符:条件操作符是C++中唯一的三元操作符:
条件?条件为真的分支1 :条件为假的分支2
,关于条件操作符我们需要注意以下几点- 条件操作符接收一个可以转换为
bool
类型的表达式与两个类型相同
的表达式,其中只有一个表达式会被求值 - 如果后两个表达式均为左值,则条件操作符构成的表达式返回左值,否则返回右值
- 条件操作符是右结合的
- 条件操作符接收一个可以转换为
-
逗号操作符:逗号操作符确保操作数会被从左向右求值,求值的结果为右操作数,它是左结合的
注意函数调用中的
,
不是逗号操作符,也不会进行求值并返回一个求值结果 -
sizeof
操作符:sizeof
操作符的操作数可以是一个类型或者一个表达式,它返回类型或表达式的返回类型对应的对象的尺寸。关于sizeof
表达式我么你需要注意,它并不会实际求值,而是只返回相应的尺寸,比如int * ptr = nullptr; sizeof(*ptr); // 语句合法,并不会实际求值,只返回相应的尺寸
除了这些,还剩下一些非常简单,不需要额外说明的操作符
- 域解析操作符:
::
- 函数调用操作符:
()
- 索引操作符:
[]
- 抛出异常操作符:
throw
- …
C++17对表达式求值顺序的限定
在C++17以后,在以下表达式中,可以确保e1会先于e2被求值
- e1[e2]
- e1.e2
- e1.*e2
- e1->e2
- e1<<e2
- e1>>e2
- e2=e1/e2+=e1/e2*=e1等等
同时在使用new Type(e)
时会确保e在分配内存之后被求值