優先級
優先級從上到下依次遞減,最上面具有最高的優先級,逗號操作符具有最低的優先級。
基本的優先級需要記住:
指針最優,單目運算優於雙目運算。如正負號。
請特別注意:1 << 3 + 2 && 7等價於 (1 << (3 + 2))&&7.
算術運算 > 移位運算 > 關系運算 > 位運算 > 邏輯運算 > 賦值運算
(算術移 為 關位邏 賦值)
a = 2+58>>2>13|15&&8 = 1
運算符優先級C語言優先級
|
優先級
|
運算符
|
名稱或含義
|
使用形式
|
結合方向
|
說明
|
|
1
|
[]
|
數組下標
|
數組名[整型表達式]
|
左到右
|
|
|
()
|
圓括號
|
(表達式)/函數名(形參表)
|
|||
|
.
|
成員選擇(對象)
|
對象.成員名
|
|||
|
->
|
成員選擇(指針)
|
對象指針->成員名
|
|||
|
2
|
-
|
負號運算符
|
-算術類型表達式
|
右到左
|
單目運算符
|
|
(type)
|
強制類型轉換
|
(純量數據類型)純量表達式
|
|||
|
++
|
自增運算符
|
++純量類型可修改左值表達式
|
單目運算符
|
||
|
--
|
自減運算符
|
--純量類型可修改左值表達式
|
單目運算符
|
||
|
*
|
取值運算符
|
*指針類型表達式
|
單目運算符
|
||
|
&
|
取地址運算符
|
&表達式
|
單目運算符
|
||
|
!
|
邏輯非運算符
|
!純量類型表達式
|
單目運算符
|
||
|
~
|
按位取反運算符
|
~整型表達式
|
單目運算符
|
||
|
sizeof
|
長度運算符
|
sizeof 表達式
sizeof(類型)
|
|||
| 3 |
/
|
除
|
表達式/表達式
|
左到右 |
雙目運算符
|
|
*
|
乘
|
表達式*表達式
|
雙目運算符
|
||
|
%
|
余數(取模)
|
整型表達式%整型表達式
|
雙目運算符
|
||
|
4
|
+
|
加
|
表達式+表達式
|
左到右
|
雙目運算符
|
|
-
|
減
|
表達式-表達式
|
雙目運算符
|
||
|
5
|
<<
|
左移
|
整型表達式<<整型表達式
|
左到右
|
雙目運算符
|
|
>>
|
右移
|
整型表達式>>整型表達式
|
雙目運算符
|
||
|
6
|
>
|
大於
|
表達式>表達式
|
左到右
|
雙目運算符
|
|
>=
|
大於等於
|
表達式>=表達式
|
雙目運算符
|
||
|
<
|
小於
|
表達式<表達式
|
雙目運算符
|
||
|
<=
|
小於等於
|
表達式<=表達式
|
雙目運算符
|
||
|
7
|
==
|
等於
|
表達式==表達式
|
左到右
|
雙目運算符
|
|
!=
|
不等於
|
表達式!= 表達式
|
雙目運算符
|
||
|
8
|
&
|
按位與
|
整型表達式&整型表達式
|
左到右
|
雙目運算符
|
|
9
|
^
|
按位異或
|
整型表達式^整型表達式
|
左到右
|
雙目運算符
|
|
10
|
|
|
按位或
|
整型表達式|整型表達式
|
左到右
|
雙目運算符
|
|
11
|
&&
|
邏輯與
|
表達式&&表達式
|
左到右
|
雙目運算符
|
|
12
|
||
|
邏輯或
|
表達式||表達式
|
左到右
|
雙目運算符
|
|
13
|
?:
|
條件運算符
|
表達式1? 表達式2: 表達式3
|
右到左
|
三目運算符
|
|
14
|
=
|
賦值運算符
|
可修改左值表達式=表達式
|
右到左
|
|
|
/=
|
除后賦值
|
可修改左值表達式/=表達式
|
|||
|
*=
|
乘后賦值
|
可修改左值表達式*=表達式
|
|||
|
%=
|
取模后賦值
|
可修改左值表達式%=表達式
|
|||
|
+=
|
加后賦值
|
可修改左值表達式+=表達式
|
|||
|
-=
|
減后賦值
|
可修改左值表達式-=表達式
|
|||
|
<<=
|
左移后賦值
|
可修改左值表達式<<=表達式
|
|||
|
>>=
|
右移后賦值
|
可修改左值表達式>>=表達式
|
|||
|
&=
|
按位與后賦值
|
可修改左值表達式&=表達式
|
|||
|
^=
|
按位異或后賦值
|
可修改左值表達式^=表達式
|
|||
|
|=
|
按位或后賦值
|
可修改左值表達式|=表達式
|
|||
|
15
|
,
|
逗號運算符
|
表達式,表達式,…
|
左到右
|
從左向右順序結合
|
說明:
同一優先級的運算符,結合次序由結合方向所決定。
簡單記就是:! > 算術運算符 > 關系運算符 > && > || > 賦值運算符
運算符優先級C++
|
運算符
|
描述
|
例子
|
可重載性
|
|
第一級別
|
|||
|
::
|
作用域解析符
|
Class::age = 2;
|
不可重載
|
|
第二級別
|
|||
|
()
|
函數調用
|
isdigit('1')
|
可重載
|
|
()
|
成員初始化
|
c_tor(int x, int y) : _x(x), _y(y*10){};
|
可重載
|
|
[]
|
數組數據獲取
|
array[4] = 2;
|
可重載
|
|
->
|
指針型成員調用
|
ptr->age = 34;
|
可重載
|
|
.
|
對象型成員調用
|
obj.age = 34;
|
不可重載
|
|
++
|
后自增運算符
|
for( int i = 0; i < 10; i++ ) cout << i;
|
可重載
|
|
--
|
后自減運算符
|
for( int i = 10; i > 0; i-- ) cout << i;
|
可重載
|
|
const_cast
|
特殊屬性轉換
|
const_cast<type_to>(type_from);
|
不可重載
|
|
dynamic_cast
|
特殊屬性轉換
|
dynamic_cast<type_to>(type_from);
|
不可重載
|
|
static_cast
|
特殊屬性轉換
|
static_cast<type_to>(type_from);
|
不可重載
|
|
reinterpret_cast
|
特殊屬性轉換
|
reinterpret_cast<type_to>(type_from);
|
不可重載
|
|
typeid
|
對象類型符
|
cout « typeid(var).name();
cout « typeid(type).name();
|
不可重載
|
|
第三級別(具有右結合性)
|
|||
|
!
|
邏輯取反
|
if( !done ) …
|
可重載
|
|
not
|
! 的另一種表達
|
||
|
~
|
按位取反
|
flags = ~flags;
|
可重載
|
|
compl
|
~的另一種表達
|
||
|
++
|
預自增運算符
|
for( i = 0; i < 10; ++i ) cout << i;
|
可重載
|
|
--
|
預自減運算符
|
for( i = 10; i > 0; --i ) cout << i;
|
可重載
|
|
-
|
負號
|
int i = -1;
|
可重載
|
|
+
|
正號
|
int i = +1;
|
可重載
|
|
*
|
指針取值
|
int data = *intPtr;
|
可重載
|
|
&
|
值取指針
|
int *intPtr = &data;
|
可重載
|
|
new
|
動態元素內存分配
|
long *pVar = new long;
MyClass *ptr = new MyClass(args);
|
可重載
|
|
new []
|
動態數組內存分配
|
long *array = new long[n];
|
可重載
|
|
delete
|
動態析構元素內存
|
delete pVar;
|
可重載
|
|
delete []
|
動態析構數組內存
|
delete [] array;
|
可重載
|
|
(type)
|
強制類型轉換
|
int i = (int) floatNum;
|
可重載
|
|
sizeof
|
返回類型內存
|
int size = sizeof floatNum;
int size = sizeof(float);
|
不可重載
|
|
第四級別
|
|||
|
->*
|
類指針成員引用
|
ptr->*var = 24;
|
可重載
|
|
.*
|
類對象成員引用
|
obj.*var = 24;
|
不可重載
|
|
第五級別
|
|||
|
*
|
乘法
|
int i = 2 * 4;
|
可重載
|
|
/
|
除法
|
float f = 10.0 / 3.0;
|
可重載
|
|
%
|
取余數(模運算)
|
int rem = 4 % 3;
|
可重載
|
|
第六級別
|
|||
|
+
|
加法
|
int i = 2 + 3;
|
可重載
|
|
-
|
減法
|
int i = 5 - 1;
|
可重載
|
|
第七級別
|
|||
|
<<
|
位左移
|
int flags = 33 << 1;
|
可重載
|
|
>>
|
位右移
|
int flags = 33 >> 1;
|
可重載
|
|
第八級別
|
|||
|
<
|
小於
|
if( i < 42 ) …
|
可重載
|
|
<=
|
小於等於
|
if( i <= 42 ) ...
|
可重載
|
|
>
|
大於
|
if( i > 42 ) …
|
可重載
|
|
>=
|
大於等於
|
if( i >= 42 ) ...
|
可重載
|
|
第九級別
|
|||
|
==
|
恆等於
|
if( i == 42 ) ...
|
可重載
|
|
eq
|
== 的另一種表達
|
||
|
!=
|
不等於
|
if( i != 42 ) …
|
可重載
|
|
not_eq
|
!=的另一種表達
|
||
|
第十級別
|
|||
|
&
|
位且運算
|
flags = flags & 42;
|
可重載
|
|
bitand
|
&的另一種表達
|
||
|
第十一級別
|
|||
|
^
|
位異或運算
|
flags = flags ^ 42;
|
可重載
|
|
xor
|
^的另一種表達
|
||
|
第十二級別
|
|||
|
|
|
位或運算
|
flags = flags | 42;
|
可重載
|
|
bitor
|
|的另一種表達
|
||
|
第十三級別
|
|||
|
&&
|
邏輯且運算
|
if( conditionA && conditionB ) …
|
可重載
|
|
and
|
&&的另一種表達
|
||
|
第十四級別
|
|||
|
||
|
邏輯或運算
|
if( conditionA || conditionB ) ...
|
可重載
|
|
or
|
||的另一種表達
|
||
|
第十五級別(具有右結合性)
|
|||
|
? :
|
條件運算符
|
int i = (a > b) ? a : b;
|
不可重載
|
|
第十六級別(具有右結合性)
|
|||
|
=
|
賦值
|
int a = b;
|
可重載
|
|
+=
|
加賦值運算
|
a += 3;
|
可重載
|
|
-=
|
減賦值運算
|
b -= 4;
|
可重載
|
|
*=
|
乘賦值運算
|
a *= 5;
|
可重載
|
|
/=
|
除賦值運算
|
a /= 2;
|
可重載
|
|
%=
|
模賦值運算
|
a %= 3;
|
可重載
|
|
&=
|
位且賦值運算
|
flags &= new_flags;
|
可重載
|
|
and_eq
|
&= 的另一種表達
|
||
|
^=
|
位異或賦值運算
|
flags ^= new_flags;
|
可重載
|
|
xor_eq
|
^=的另一種表達
|
||
|
|=
|
位或賦值運算
|
flags |= new_flags;
|
可重載
|
|
or_eq
|
|=的另一種表達
|
||
|
<<=
|
位左移賦值運算
|
flags <<= 2;
|
可重載
|
|
>>=
|
位右移賦值運算
|
flags >>= 2;
|
可重載
|
|
第十七級別
|
|||
|
throw
|
異常拋出
|
throw EClass(“Message”);
|
不可重載
|
|
第十八級別
|
|||
|
,
|
逗號分隔符
|
for( i = 0, j = 0; i < 10; i++, j++ ) …
|
可重載
|
