C++ Primer 5th學習筆記3 表達式

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)/nm/(-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運算,只返回該類型固定部分的大小,不會計算對象中的元素佔用了多少空間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章