C primer 5th 第四章筆記

2022-02-26 04:35:26 字數 2951 閱讀 9195

運算子:  一元 , 二元 , 三元

組合運算子 和 運算物件 : 

優先順序:  使用  () 避免優先順序的混淆的問題

結合律:  

求值順序:二元運算子兩邊的表示式計算順序可能存在差異, 應該避免

對優先順序 , 結合率 , 求值順序的解釋:

//

如下表示式: //

我們假設 g() 的操作是將全域性變數 i = 10 的值 乘以 2 返回 //

我們假設 h() 的操作是將全劇變數 i 的值 + 2 返回

f() + g() * h() +j()

//優先順序 : 存在於組合運算當中 , 也就是多個運算子參與 , 優先順序是運算子 與 運算子之間的關係

//結合率 : 我們針對 上述表示式 可以 使用 結合率 的方式改變運算子的優先順序

//( f() + g() ) * h() + j()

//求值順序 : 對於 單個二元運算子來說 , 先算右邊 還是 先算左邊 好像只有在 邏輯運算子 : || && 上才有體現 , 但是在 * 上可能存在差異 , 如上 ,

//如果我們先算左邊 , 在算右邊 ; 那 g() * h() 的結果就是 20 * 22 = 440

//如果我們先算右邊 , 在算左邊 ; 那 g() * h() 的結果就是 24 *12 = 288

//所以我覺得 能不在乙個運算子兩邊修改 共有的部分 是最好的。

運算物件轉換 :

表示式中勻允許不同型別之間的轉換 , 編譯器會自動的轉換

int 還會有型別提公升

在算術型別之間的運算 需要保證 運算結果不溢位 , 且精度損失降低到最小 , 才有運算結果的型別一定是其中的最高型別。

過載運算子:

將運算子 賦予 在某乙個非基本型別上面新的含義

左值 與 右值 :

將乙個物件當作左值來使用 : 代表的是當前物件本身

將乙個物件當作右值來使用 : 代表的是當前物件的拷貝

需要右值的地方可以使用 左值代替 , 但是反過來通常不行

decltype 與 左值 右值:

如果 decltype 的是乙個左值型別 , 那麼得到一定是乙個引用型別 , 如果decltype 的是乙個右值型別 , 那麼得到的一定是乙個 普通型別

#include using

namespace

std;

intmain()

~

decltype 的是的左值型別

略注意 : &&  || 有運算子求值順序的規定 , 先算左邊在算右邊 ,左邊滿足的順序右邊不再計算 , 這就是短路

. 與 ->

sizeof(型別) 可以獲得該型別占用的記憶體大小 ,c++ 可以讓sizeof 直接訪問 類的成員的  , 以此的其成員型別占用的記憶體的大小.  sizeof (class::number)

結合律從左邊向右邊 , 最後的結果為最右邊的表示式子 , 且如果最右邊的表示式是左值 , 整個表示式結果為左值  , 否則為右值

如果兩個型別之間可以相互轉換 , 那麼他們就是有關聯的.

無須程式設計師的介入的型別轉換稱為隱式型別轉換.

顯式型別轉換:

static_cast<>():

不能擦除引用 , 指標 的 底層 const 屬性。

大範圍型別 向 小範圍型別 ,  高精度 向 低精度  : 告訴編譯器我是故意轉換的 , 而且我能確保這樣作的後果沒有問題 , 你把警告給我關了吧

const_cast<>():

只能改變物件的頂層const屬性 , 不能值型別轉換:

只有當底層const指向的物件不是 const ,  才能進行擦除const :

#include using

namespace

std;

intmain()

dynamic_cast<>()

用於具有繼承體系之間的轉換  指標和引用 , 類必須具有虛函式  ,  父類指標指向的 子類物件向 向子類指標轉換 ,  或者父類引用指向子類的向子類引用轉換使用:

父類指標 指向父型別物件 向 子型別指標轉換 |   乙個父類的兩個子類之間轉換   最後為 null

父類引用 指向父型別物件 向 子型別引用轉換 丟擲 std::bad_cast 異常

#include class

a }

class b :public

a;class c :public

a;int

main()

b *ba = dynamic_cast(a); //

父類轉換成子類 , 不安全

if(null ==ba)

a ra;

a & aa =ra;

trycatch

(std::bad_cast)

return0;

}輸出結果 :

2 個子類指標之間不能發生轉換!父類指標 指向 父類物件 不能向子類指標轉換!父類引用 指向 父類物件 不能向子類引用轉換!

reinterpret_cast<>():

不建議使用

C Primer 第四章筆記

左值和右值 乙個左值表示式的求職結果是乙個物件或者乙個函式,然而以常量物件為代表的某些左值實際上不能作為賦值語句的左側運算物件。當乙個物件用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 對於某些沒有執行順序的運算子來說,如果表示式指向並修改了同乙個物...

C primer 第四章筆記 初稿

左值和右值 求值順序 號對布林運算無效 溢位運算 取餘運算可以為負,但不可以為浮點數 m n n m m n m n m n,m n m n 如果想右結合連續賦值,就必須滿足變數型別相同或可相互轉化 優先選擇前置遞增而不是後置遞增 後置遞增運算子優先順序高於解引用運算子 位運算存在一定的公升級擴容,...

C primer(第四章)學習筆記

第四章 表示式 1.表示式由乙個或者多個運算物件operand組成,對表示式求值將得到乙個結果result。字面值和變數是簡單的表示式expression。把乙個運算子operator和乙個或多個運算物件組合起來可以生成交複雜的表示式。一元運算子 取位址符 解引用符 二元運算子 相等運算子 乘法運算...