菜狗的C primer讀書筆記 第四章 表示式

2021-07-27 16:50:05 字數 2088 閱讀 9972

運算子基本概念

1.對於含有多個運算子的複雜表示式來說,要想理解它的含義首先要理解運算級、結合律、以及運算物件的求值順序。

2.過載運算子:當運算子作用於類型別的運算物件時,使用者可以自定義其含義。在使用過載運算子時,其包括運算物件的型別和返回值的型別都是由該運算子定義的;但是運算物件的個數、運算子的優先順序和結合律都是無法改變的。

3.c++中左值右值的含義不像c語言中那麼簡單,做乙個歸納:當乙個物件被用作右值的時候用的是物件的值(內容);當物件被用作左值的時候,用的是物件的身份(在記憶體中的位置)。有幾個熟悉的運算子是要用到左值的:賦值運算子、取位址符、某些解引用運算子及遞增遞減運算子和下標運算子。

4.使用decltype關鍵字時左值和右值也有所不同。若表示式求值結果是乙個左值,將得當引用型別。

5.對於那些沒有指定執行順序的運算子來說,如果表示式指向並修改了同乙個物件,將會引發錯誤並產生未定義的行為。運算物件的求值順序與優先順序和結合律無關。有四種運算子明確規定了求值順序:(&&)、(||)、(?:)、(,)。

6.處理復合表示式的兩個經驗:

①.拿不準時最好用括號讓表示式組合關係符合程式邏輯要求。

②.如果改變了某個運算物件的值,在表示式的其他地方不要再使用這個運算物件。(重要例外:當改變運算物件的子表示式本身就是另乙個子表示式的運算物件時除外)

運算子1.算數運算子的運算物件和求值結果都是右值。在表示式求值之前,小整數型別的運算物件被提公升成較大的整數型別,所有運算物件最終會轉換成同一型別。

2.取餘運算的運算物件必須是整數型別,且m%(-n)與m%n等價。

3.關係運算子作用於指標型別,邏輯運算子作用於任意能轉換成布林值的型別。

4.對邏輯與和邏輯或運算子來說,當且僅當左側運算物件無法確定表示式的結果時才會計算右側物件的值,這種策略稱為短路求值。

5.賦值運算子的左側物件必須是乙個可修改的左值,賦值運算的結果是它的左側運算物件並且是乙個左值,且結果型別是左側運算物件的型別。

6.因為賦值運算子的優先順序低於關係運算子的優先順序,所以在條件語句中賦值部分通常應該加上括號。

7.養成使用前置遞增遞減運算子的習慣,這樣不僅不需要擔心效能的問題,而且更重要的是寫出的**會更符合程式設計的初衷。

8.因為遞增遞減運算子會改變運算物件的值,所以要提防在復合表示式中錯用這兩個運算子。

9.當條件運算子的兩個表示式都是左值或者能轉換成同一種左值型別時運算結果為左值,否則運算的結果是右值。

10.條件運算子可以巢狀。

11.條件運算子的優先順序非常低,因此當一條長表示式中巢狀了條件運運算元表示式時通常要在它兩端加上括號。

12.位運算子作用於整數型別的運算物件,並把運算物件看成二進位制位的集合。

13.關於符號位如何處理沒有明確規定,所以強烈建議僅將位運算子用於處理無符號型別。

14.對位運算子來說如果運算物件是小整型,則它的值會被提公升。

15.靈活運用位運算子可以達到意想不到的效果,例如可以用char儲存32個資料。

16.sizeof運算子有兩種形式:sizeof (type) 和 sizeof expr。

17.sizeof並不實際計算其運算物件的值,在sizeof中解引用乙個無效指標仍然是一種安全的行為,因為指標實際上並沒有被真正使用。

18.對string和vector物件執行sizeof運算只返回該型別固定的大小,不會計算物件中的元素占用了多少空間。

型別轉換

1.隱式轉換:

①.算數轉換,其中注意整數的提公升和無符號型別的運算物件

②.陣列轉換成指標

③.指標轉換,包括整數常量0或字面值nullptr轉換成任意指標型別、指向任意非常量的指標轉換成void*以及指向任意物件的指標能轉換成const void*

④.轉換成布林型別

⑤.轉換成常量

⑥.類型別定義的轉換

2.顯示轉換(命名的強制):

①.dynamic_cast

②.static_cast:當需要把乙個較大的算數型別賦給較小型別或對於編譯器無法自動執行的型別轉換非常有用,當將void*型別指標強制轉換為原來型別時,必須確保轉換後所得的型別就是指標所指的型別

③.const_cast:只能改變運算物件的底層const

④.reinterpret_cast:盡量不要使用

盡量避免使用強制型別轉換

C primer 讀書筆記

第2 章 變數和基本型別 1 變數直接初始化和變數 複製初始化 int ival 1024 direct initialization int ival 1024 copy initialization 初始化不是賦值 2 內建型別復 制初始化和直接初始化幾乎沒有區別 但 對類型別物件來 說,有些初...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...

C Primer讀書筆記

前些日子開始看 c primer 順便做一些筆記,既有書上的,也有自己理解的。因為剛學c 不久,筆下難免有謬誤之處,行文更是凌亂 所幸不是用來顯配的東西,發在linuxsir只是為了方便自己閱讀記憶,以防只顧上網忘了正事。書看了不到一半,所以大約才寫了一半,慢慢補充。const要注意的問題 1 下面...