C++中的操作符属性列表如下:
优先级 | 名称 | 符号 | 左值/右值 | 结合性 | 说明 |
1 | 全局作用域 | :: | 左 | 左 | C++ |
类作用域 | :: | 左 | 左 | C++ | |
命名空间 | :: | 左 | 左 | C++ | |
2 | 括号 | () | 同表达式 | 无 | C/C++ |
函数调用 | () | 右 | 左 | C/C++ | |
下标 | [] | 左 | 左 | C/C++ | |
成员访问 | . | 左 | 左 | C语言中代表结构体,c++中是类 | |
指针成员访问 | -> | 左 | 左 | C语言中代表结构体,c++中是类 | |
3 | 后自增 | ++ | 右 |
| 返回的是右值 |
后自减 | -- | 右 |
| 返回的是右值 | |
类型ID | typeid | 无 | 右 |
| |
运行时类型ID | typeid | 无 | 右 |
| |
显示强制类型转换 | Dynamic_cast static_cast Reinterpret_cast Const_cast | 右 | 右 | 运行时识别指针或引用 普通类型转换 强制不能转换的类型进行转换 转换掉const属性 | |
4 | 求类型大小 | sizeof | 右 | 右 | 以一个字节为单位,判断表达式时不需要对表达式求值,例如:sizeof(a=b+1),sizeof不能用于函数类型,不完全类型或者位字段或者void类型 |
前自增 | ++ | 不定 | 右 | C中是右值,c++中是左值 | |
前自减 | -- | 不定 | 右 | C中是右值,c++中是左值 | |
位取反 | ~ | 右 | 右 |
| |
逻辑非 | ! | 右 | 右 |
| |
一元正/负 | +/- | 右 | 右 |
| |
解引用 | * | 左 | 右 |
| |
取地址 | & | 右 | 右 |
| |
类型转换 | () | 右 | 右 | 类型等级排名(无符号>有符号) | |
创建对象 | new | 左 | 右 | 如果new操作符申请空间不足,会抛出bad_alloc的异常 | |
释放对象 | delete | 右 | 右 | 必须释放是由new申请的内存空间,但是释放值为0的指针是安全的,一旦delete一个指针,该指针便为悬垂指针,应立即设置为0 | |
5 | 指向成员操作的指针 | ->* |
| 左 |
|
.* |
| 左 |
| ||
6 | 乘/除/求余 | */ / /% | 右 | 左 | 计算时注意越界,要用类型转换 |
7 | 加/减 | +/- | 右 | 左 |
|
8 | 左/右移位 | <</>> | 右 | 左 | 对于无符号数的算术右移是不可移植的,右操作数不能是负数,而且必须严格小于左操作数的位数 |
9 | 关系操作符 | >/>=/</<= | 右 | 左 | C语言产生整型,c++产生bool型,不能串接 |
10 | 相等/不等 | =/!= | 右 | 左 | C语言产生整型,c++产生bool型 |
11 | 位与 | & | 右 | 左 |
|
12 | 位异或 | ^ | 右 | 左 |
|
13 | 位或 | | | 右 | 左 |
|
14 | 逻辑与 | && | 右 | 左 | 短路求值 |
15 | 逻辑或 | || | 右 | 左 | 短路求值 |
16 | 条件表达式 | ?: | 右 | 右 | 短路求值,两个表达式只求一个,可以直接在输出表达式中使用 |
17 | 各种赋值 | …… | 右 | 右 | 复合赋值操作符先将右侧的完整求值再与左边运算,赋值操作符的左操作数必须是非const的左值 |
18 | 抛出异常 | throw | 无 | 右 |
|
19 | 逗号 | , | 右 | 左 | 逗号表达式不能为空,优先级最低的,如果赋值的话,必须用括号括起来,逗号操作符的结果是其最右边的表达式,其属性也与最右边的属性一致 |
<分析>:
(1)左值意味着一个位置,右值意味着一个值
(2)优先级、结合性只决定相邻两个操作符的执行顺序,同一个操作符的左右操作数的执行顺序无法确定
(3)对于同一个双目操作符,我们没办法知道是先计算左边的表达式,还是先 计算右边的 表达式,不可移植。尤其是自增、自减这类操作符出现就会存在副作用。但是&&,||,条件表达式,逗号表达式都规定了求值顺序
(4)各个不同的类型的值不能进行相互计算,必须先转换成相同类型的值。
(5)对于自增和自减操作符,最后使用前置操作符,因为前置操作符需要做的工作更少,加1后自动返回,而后置操作符先需要保存原来的值,以便返回未加1之前的值。
(6)因为同一个操作符的左右操作数计算先后顺序未定,所以尽量不要在同一个语句中多次使用同一个操作数,可以分成几条独立的语句使用,尤其是自增自减操作符,不要在一个表达式中多次对同一个对象作自增自减操作。