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)因为同一个操作符的左右操作数计算先后顺序未定,所以尽量不要在同一个语句中多次使用同一个操作数,可以分成几条独立的语句使用,尤其是自增自减操作符,不要在一个表达式中多次对同一个对象作自增自减操作。