以下是C++程式語言中的所有運算子的優先級和結合性列表。
優先級 | 運算子 | 敘述 | 示例 | 重載性 | 結合性 |
---|---|---|---|---|---|
1 |
:: |
作用域解析(C++專有) | Class::age = 2; |
否 | 由左至右 |
2 |
++ |
后綴遞增 | i++ | ||
-- |
后綴遞減 | i-- | |||
{} |
組合 | {i++;a*=i;} | |||
() |
函數調用或變量初始化 | c_tor(int x, int y) : _x(x), _y(y * 10) {} | |||
[] |
數組訪問 | array[4] = 2; | |||
. |
以對象方式訪問成員 | obj.age = 34; | 否 | ||
-> |
以指針方式訪問成員 | ptr->age = 34; | |||
dynamic_cast |
運行時檢查類型轉換(C++專有) | Y& y = dynamic_cast<Y&>(x); | 否 | ||
static_cast |
未經檢查的類型轉換(C++專有) | Y& y = static_cast<Y&>(x); | 否 | ||
reinterpret_cast |
重定義類型轉換(C++專有) | int const* p = reinterpret_cast<int const*>(0x1234); | 否 | ||
const_cast |
更改非常量屬性(C++專有) | int* q = const_cast<int*>(p); | 否 | ||
typeid |
獲取類型信息(C++專有) | std::type_info const& t = typeid(x); | 否 | ||
3 |
++ |
前綴遞增 | ++i | 由右至左 | |
-- |
前綴遞減 | --i | |||
+ |
一元正號 | int i = +1; | |||
- |
一元負號 | int i = -1; | |||
! not |
邏輯非! 的備用拼寫 |
if (!done) … | |||
~ compl |
按位取反~ 的備用拼寫 |
flag1 = ~flag2; | |||
(type) |
強制類型轉換 | int i = (int)floatNum; | |||
* |
引用 | int data = *intPtr; | |||
& |
取某某的地址(參考) | int *intPtr = &data; | |||
sizeof |
某某的大小 | size_t s = sizeof(int); | 否 | ||
new |
動態內存分配(C++專有) | long* pVar = new long; | |||
new[] |
動態數組內存分配(C++專有) | long* array = new long[20]; | |||
delete |
動態內存釋放(C++專有) | delete pVar; | |||
delete[] |
動態數組內存釋放(C++專有) | delete [] array; | |||
4 |
.* |
成員對象選擇(C++專有) | obj.*var = 24; | 否 | 由左至右 |
->* |
成員指針選擇(C++專有) | ptr->*var = 24; | |||
5 |
* |
乘法 | int i = 2 * 4; | ||
/ |
除法 | float f = 10.0 / 3.0; | |||
% |
模數(取余) | int rem = 4 % 3; | |||
6 |
+ |
加法 | int i = 2 + 3; | ||
- |
減法 | int i = 5 - 1; | |||
7 |
<< |
位元左移 | int flags = 33 << 1; | ||
>> |
位元右移 | int flags = 33 >> 1; | |||
8 |
< |
小於關系 | if (i < 42) … | ||
<= |
小於等於關系 | if (i <= 42) ... | |||
> |
大於關系 | if (i > 42) … | |||
>= |
大於等於關系 | if (i >= 42) ... | |||
9 |
== eq |
等於關系== 的備用拼寫 |
if (i == 42) ... | ||
!= not_eq |
不等於關系!= 的備用拼寫 |
if (i != 42) … | |||
10 |
& bitand |
位元 AND& 的備用拼寫 |
flag1 = flag2 & 42; | ||
11 |
^ xor |
位元 XOR(獨占or)^ 的備用拼寫 |
flag1 = flag2 ^ 42; | ||
12 |
| bitor |
位元 OR(包含or)| 的備用拼寫 |
flag1 = flag2 | 42; | ||
13 |
&& and |
邏輯 AND&& 的備用拼寫 |
if (conditionA && conditionB) … | ||
14 |
|| or |
邏輯 OR|| 的備用拼寫 |
if (conditionA || conditionB) ... | ||
15 |
c?t:f |
三元條件運算 | int i = a > b ? a : b; | 否 | 由右至左 |
16 |
= |
直接賦值 | int a = b; | ||
+= |
以和賦值 | a += 3; | |||
-= |
以差賦值 | b -= 4; | |||
*= |
以乘賦值 | a *= 5; | |||
/= |
以除賦值 | a /= 2; | |||
%= |
以取余數賦值 | a %= 3; | |||
<<= |
以位元左移賦值 | flags <<= 2; | |||
>>= |
以位元右移賦值 | flags >>= 2; | |||
&= and_eq |
以位元AND賦值&= 的備用拼寫 |
flags &= new_flags; | |||
^= xor_eq |
以位元XOR賦值^= 的備用拼寫 |
flags ^= new_flags; | |||
|= or_eq |
以位元OR賦值|= 的備用拼寫 |
flags |= new_flags; | |||
17 |
throw |
拋出異常 | throw EClass(“Message”); | 否 | |
18 |
, |
循環評估運算 | for (i = 0, j = 0; i < 10; i++, j++) … | 由左至右 |
1. 算術運算符及算術表達式:
c++中的算術運算符有:+(取正或加),-(取負或減),*(乘),/(除),%(取余),++(增1),
--(減1)。其中+(取正),-(取負),++(增1),--(減1)是單目運算符,其余是雙目運算符。
+,-,*,/ 運算符與其在數學中的意義,優先級,結合性基本相同。但必須注意“/”運算符,當它的兩個操作數都是整數時,其計算結果也是整型,結果為兩整數相除后的商。例,3/2的結果是1,3/5的結果是0.
運算符“%”是取余運算,結果為兩個整數相除后的余數。例如,5%3的結果是2,6%2結果是0.
注意:要求取余運算符“%”的兩個操作數必須是整型或字符型數據。
增1,減1運算是將變量的值增1或減1.這兩個運算符都有前置和后置兩種形式。前置形式是先計算操作數的值(增1或減1),然后把操作數的值作為表達式的結果。而后置形式是先將操作數的值作為表達式的結果,然后將操作數的值(增1或減1)。
2. 關系運算符及關系表達式:
關系運算是比較兩個操作數的大小。當兩個操作數滿足關系運算符指定的關系時,表達式的值為true,否則為false。
在c++中,關系運算符都是雙目運算符,共有6個:<(小於)<=(小於等於)>(大於)>=(大於等於)==(等於)!=(不等於)。其中前4種和后2種屬於不同的優先級,前4種的優先級高於后2種。
由關系運算符和操作運算符組成的表達式為關系表達式,關系表達式的結果為布爾類型。
3. 邏輯運算符及邏輯表達式:
邏輯運算符共有3個:1個單目運算符“!”,2個雙目運算符“&&”(邏輯與)和“||”(邏輯或)。其中邏輯與的優先級比邏輯或高。
邏輯運算的結果是邏輯值。參與邏輯運算的操作數可以是任一基本類型的數據,在進行判斷時,系統將非零值作為真,零為假。
對於單目運算符“!”(邏輯求反),若其操作數為false(0),運算結果為true(1),否則為false(0)。例如,!5的結果為0.
對於“&&”(邏輯與)運算符,只要兩個操作數中有一個為false(0),運算結果就為false(0),否則true(1).例如,2&&5的結果為1.
對於“||”(邏輯或)運算符,只要兩個操作數中有一個為true(1),運算結果就為true(1),否則為false(0)。例如,5||0的結果為1.
由邏輯預算副和操作數構成的表達式為邏輯表達式,邏輯表達式的結果為布爾類型。
注意:當多個“||”(邏輯或)運算符,只要兩個操作數中有一個為true(1),運算結果就為true(1),否則則為false(0),停止后續計算,例如:a=0,b=2,c=3;表達式a++||b++||c++運算后,整個表達式值為true(1),a的值為1,b的值為2,c的值為3.
4. 賦值運算符和賦值表達式:
c++中的賦值運算符分兩種:簡單賦值運算和復合賦值運算符。賦值運算符都是二元運算符,右結合。由賦值運算符和操作數組成的表達式稱為賦值表達式。
(1)簡單賦值運算符
c++中的簡單賦值運算符為“=”。其表達式的一般形式為:
變量=表達式
該表達式執行時,先計算賦值運算符右部“表達式”的值,然后將它賦給左邊的變量。賦值表達式的值為左邊變量的值,其類型為左邊變量的類型。
(2) 復合賦值運算符:
復合賦值運算符由一個基本賦值運算符和其他一些運算符復合構成,共有10個,分別為:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=.
如果以“op”表示某種運算符,則復合賦值表達式的一般形式為:
變量op=表達式
等價於:
變量=變量op表達式
即先用左部變量和右部表達式作數值運算,然后將運算結果送給左部變量。例如:
a+=3 等價於 a=a+3
使用復合賦值運算符不僅書寫簡練,而且經過編譯以后生成的代碼少。
5. 位運算符:
c++提供了6個位運算符:~(按位求反),&(按位與),|(按位或),^(按位異或),<<(左移位),>>(右移位),其中按位求反是單目運算符,其余都是雙目運算符。
位運算符是對其操作數按二進制形式逐位進行運算,參與運算的操作數都應為整型數,不能是實型數。
(1)~(按位求反):其作用是對一個二進制數的每一位求反,即0→1,1→0.
(2)&(按位求反):其作用是對兩個操作數對應的每一位分別進行邏輯與操作。兩操作數對應位都是1,則該位運算結果為1,否則該位運算結果為0.
(3)|(按位或):其作用是對兩個操作數對應的每一位非別進行邏輯或操作。兩操作數對應位中有1位是1,則該位運算結果為1,否則該位運算結果為0.
(4)^(按位異或):其作用是對兩個操作數對應的每一位分別進行邏輯異或操作。兩操作數對應位的值不同,則該位運算結果為1,否則該位運算結果為0.
(5)>>(右移位):將左操作數的各二進制位右移,右移位數由右操作數給出。右移1位相當於將操作數除以2。例如,表達式8<<1的結果為4.
(6)<<(左移位):將左操作數的各二進制位左移,左移位數由右操作數給出。左移1位相當於將操作數乘以2.例如,表達式2<<1的結果為4.
注意:移位運算的結果就是位運算表達式的值,參與運算的兩個操作數的值並沒有發生變化。
6. 條件運算符:
條件運算符“?:”是c++中位移的一個三目運算符,其使用的一般形式為:
表達式?表達式2:表達式3
該表達式執行時,先計算表達式1,若其值為真,則表達式2的值為條件表達式的值;否則表達式3的值為條件表達式的值。條件運算符的優先級低於算術運算符,關系運算符和邏輯運算符,高於賦值運算符,結合性“從右到左”。
7.逗號運算符:
由逗號運算符構成的表達式稱為逗號表達式,其一般形式為:
表達式1,表達式2。。。,表達式n
逗號表達式的執行規則是從左到右逐個表達式執行,最后一個表達式的值是該逗號表達式的值。
注意:逗號運算符的優先級最低。