1、算術運算符
運算符 | 功能 | 描述 |
---|---|---|
+ |
一元正號 | + expr |
- |
一元負號 | - expr |
* |
乘法 | expr * expr |
/ |
除法 | expr / expr |
% |
求餘 | expr % expr |
+ |
加法 | expr + expr |
- |
減法 | expr - expr |
上述運算符的優先級中,由上往下,一元運算符優先級最高,其次是乘除運算,最後是加減運算,所有的運算符都滿足左結合律。
對於求餘運算,如果m和n都是整數,且m非0;則表達式(m/n)*n+m%n
的求值結果與m相等,即若m%n不爲0,則結果的符號和m相同。除了-m導致溢出的特殊情況,其他時候(-m)/n
和m/(-n)
都等於-(m/n)
,m%(-n)
等於m%n
,(-m)%n
等於-(m%n)
。
2、邏輯運算符
運算符 | 結合律 | 功能 | 描述 |
---|---|---|---|
! |
右 | 邏輯非 | !expr |
< |
左 | 小於 | expr < expr |
<= |
左 | 小於等於 | expr <= expr |
> |
左 | 大於 | expr > expr |
>= |
左 | 大於等於 | expr >= expr |
== |
左 | 相等 | expr == expr |
!= |
左 | 不相等 | expr != expr |
&& |
左 | 邏輯與 | expr && expr |
|| |
左 | 邏輯或 | expr || expr |
對於邏輯與和或運算有以下規則(短路求值):
- 邏輯與運算:當且僅當左側運算對象爲真時纔對右側運算對象求值
- 邏輯與運算:當且僅當左側運算對象爲假時纔對右側運算對象求值
3、遞增和遞減運算符
遞增運算符(++)和遞減運算符(–)提供了簡單的加1和減1操作。有兩種形式:前置版本和後者版本。區別在於,前置版本是先將運算符對象加1(或減1),然後改變後的對象作爲求值結果。後置版本也會將運算對象加1,但求值結果是運算對象改變之前那個值的副本:
int i = 0, k = 0, j;
j = ++i; //j = 1, i = 1:前置版本得到遞增之後的值
j = k++; //j = 0, k = 1:後置版本得到遞增之前的值
簡單來說就是,符號和變量誰在前,先執行誰。遞增在前,就先遞增再求值;遞增在後,就先求值再遞增。
4、成員訪問運算符
點運算符和箭頭運算符都可用於訪問成員。點運算符獲取類對象的一個成員;箭頭運算符與點運算有關,表達式ptr->mem
等價於(*ptr).mem
:
string s1 = "a string", *p = &s1;
auto n = s1.size();
n = (*p).size();
n = p->size();
Tip:解引用運算符的優先級低於點運算符,因此執行解引用運算的子表達式兩端必須加上括號
5、條件運算符
條件運算符(?:)使用方法:
cond ? expr1 : expr2;
cond是判斷條件的表達式,若cond爲真,則計算expr1,並返回其值,否則計算expr2,返回expr2。
6、位運算符
位運算常常用於整數類型的運算對象,其運算對象可看作是二進制位的集合
運算符 | 功能 | 描述 |
---|---|---|
~ |
位求反 | ~ expr |
<< |
左移 | expr1 << expr2 |
>> |
右移 | expr1 >> expr2 |
& |
位與 | expr1 & expr2 |
^ |
位異或 | expr1 ^ expr2 |
| |
位或 | expr1 | expr2 |
將變量var的第n位置1:
var |= 1 << n;
將變量var的第n位置0:
var &= ~(1 << n;)
7、sizeof運算符
sizeof運算符返回一條表達式或一個類型名字所佔的字節數。其運算結果部分依賴於其作用的類型:
- 對char或者類型爲char的表達式執行sizeof,其結果是1
- 對引用類型執行sizeof運算得到被引用對象所佔空間的大小
- 對指針執行sizeof運算得到指針本身所佔空間的大小
- 對解引用指針執行sizeof運算得到指針指向的對象所佔空間的大小,指針不需有效
- 對數組執行sizeof運算得到整個數組所佔空間的大小
- 對string/vector對象執行sizeof運算,只返回該類型固定部分的大小,不會計算對象中的元素佔用了多少空間