第5章 表示式 4

2021-06-01 21:30:46 字數 1837 閱讀 6257

5.12 型別轉換

c++並不是把兩個不同型別的值直接加在一起,而是提供了一組轉換規則,以便在執行算術操作之前,將兩個運算元轉換為同一資料型別。這些轉換規則由編譯器自動執行,無需程式設計師介入——有時甚至不需要程式設計師了解。因此,它們被稱為隱式型別轉換(implicit type conversion).

隱式型別轉換中,左運算元的型別佔主導地位。如果賦值操作的左右操作型別不相同,則右運算元會被轉換為左邊的型別。

5.12.1 何時發生隱式型別抓換

5.12.2 算術轉換

5.12.3 其他隱式轉換

1. 指標轉換

在使用陣列時,大多數情況下陣列都會自動轉換為指向第乙個元素的指標。

c++還提供了另外兩種指標轉換:指向任意資料型別的指標都可以轉換為void*型別;整型值數值常量0可轉換為任意指標型別。

2. 轉換為bool型別

算術值和指標值都可以轉換為bool型別。如果指標或算術值為0,則其bool值為false,而其他值為true。

3. 算術型別與bool型別的轉換

將算術型別那個轉換為bool型時,零轉換為false,而其他值則轉換為true。將bool物件轉換為算術型別時,true變成1,而false則為0.

4. 轉換與列舉型別

c++自動將列舉型別的物件或列舉成員轉換為整型,其轉換結果可用於任何要求使用整數值的地方。

5. 轉換為const物件

5.12.4 顯式轉換

顯式轉換也成為強制型別轉換(cast),包含以下列名字命名的強制型別轉換操作符:static_cast、dynamic_cast、const_cast和reinterpret_cast。

5.12.5 何時需要強制型別轉換

int i = 10;

int m = 10;

double j = 10.6;

i *= j; //106

m *= static_cast(j); //100

cout << i << endl;

cout << m << endl;

5.12.6 命名的強制型別轉換

1. dynamic_cast

dynamic_cast支援執行時識別指標或引用所指向的物件。

2. const_cast

const_cast將轉換掉表示式的const性質。

string m = "10";

const string *i = &m;

string *j = const_cast(i);

除了刪除或新增const特性,用const_cast符來執行其他任何型別轉換,都會引起編譯錯誤。

3. static_cast

編譯器隱式執行的任何型別都可以由static_cast顯式完成。

可通過static_cast將存放在void*中的指標值強制轉換為原來的指標型別,此時我們應該確保指標值。也就是說強制轉換的結果應與原來的位址值相等。

int m = 10;

int *n = &m;

void *i = n;

int *j = static_cast(i);

cout << *j << endl;

cout << *n << endl;

4. reinterpret_cast

reinterpret_cast通常為運算元的位模式提供較低層次的重新解釋。

強制型別轉換關閉或掛起了正常的型別檢查,強烈建議程式設計師避免使用強制型別轉換。

5.12.7 舊式強制型別轉換

舊式強制型別轉換符號有下列兩種形式:

type(expr); 以及 (type)expr;

第4章 表示式

解引用運算子生成左值,所以decltype p 的結果是 int 取位址運算子生成右值,所以decltype p 的結果是 int cin v1 v2 先讀入v1,再讀入v2如果表示式指向並修改了同乙個物件,將會引發錯誤並產生未定義的行為。cout v1 v1 cout 42 10 的優先順序較高,...

第4章 表示式

左值和右值 當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 求值順序 四種明確規定了運算物件的求值順序的運算子 1 處理復合表示式時 拿不準時用括號強制表示式組合關係復合程式邏輯的要求 如果改變了某個運算物件的值,在表示式其他的地方不要再...

第5章 表示式

不想從第一章開始看起,看目錄覺得對第五章中的bitset和sizeof有點興趣,嗯,研究一下。1 if ival ival作為乙個條件表示式,非0時,if條件成立。表示式結果是右值,可讀取結果,不能對它進行賦值。2 短路求值 邏輯與和邏輯或總先計算左運算元。且只在左運算元無法確定結果時,才會求解右運...