c++ 隱式類型轉換


隱式類型轉換由編譯器自動執行,不需程序員介入。

何時發生隱式類型轉換

1. 在混合類型的表達式中,操作數會被轉換為相同類型

int ival;
double dval;
ival >= dval; // ival converted to double

2. 條件表達式會被轉換為bool類型。

int ival;
if (ival) // ival converted to bool
while (cin) // cin converted to bool

條件操作符(? :)中的第一個操作數,邏輯非(!)、邏輯與(&&)、邏輯或(||)的操作數都是條件表達式。if、while、do while、以及for的第2個表達式都是條件表達式。

3. 初始化和賦值

int ival = 3.14 // 3.14 converted to int
int *ip;
ip = 0; // the int 0 converted to a null pointer of type int *

4. 在函數調用時,所傳遞的參數也可能發生隱式類型轉換。

如何轉換

1. 算術轉換

算術轉換保證在執行操作前,將二元操作符的兩個操作數轉換為同一類型,並使表達式的值也具有相同的類型。

算術轉換通常的是做整形提升(integral promotion),對於所有比int小的整形,包括char、signed char、unsigned char、short和unsigned short,如果該類型的所有可能的值都能包含在int內,它們就會被提升為int,否則被提升為unsigned int。如果將bool值提升為int,則false轉換為0,true轉換為1。

包含short和int類型的表達式,short轉換為int。如果int足以表示所有unsigned short類型的值,則將unsigned short轉換為int,否則兩個操作數均轉換為unsigned int。long和unsigned int的轉換也一樣。只要機器上的long足夠表示unsigned int類型所有的值,就將unsigned int轉換為long,否則兩個操作數都轉換為unsigned long。在32位的機器上,long和int通常用一個字長表示,此時如果表達式包含unsigned int和long,兩者都轉換為unsigned long。

如果表達式包含signed和unsigned int,signed會被轉換為unsigned。如果int 操作數的值恰為負數,其轉換為unsigned int可能會變為一個很大的正數(轉換結果是該負值對unsigned int的取值個數求模)。所以最好避免對int和unsigned int的兩個操作數進行比較。

轉換示例:

2. 其他隱式轉換

(1)數組名轉換為指向其第一個元素的指針

int ia[10]; // array of 10 ints
int *ip = ia; // convert ia to pointer to first element

另外,任意數據類型的指針都可轉換為void *,整形數值常量0可以轉換為任意類型指針。

(2)指針值可轉換為bool

如果指針為0,轉換為false,否則轉換為true。

if (cp) // true if pointer cp is not zero

(3)算術類型與bool的轉換

算術類型轉換為bool時,0轉換為false,其他值(包括負值)轉換為true。將bool轉換為算術類型時,true轉換為1,false轉換為0。

(4)轉換與枚舉類型

枚舉類型對象或枚舉成員將自動轉換為整形,其轉換結果可以用於任何需要使用整數值的地方。具體會被轉換為哪種整形,依賴於枚舉成員的最大值和機器。enum對象或枚舉成員至少提升為int,如果int無法表示枚舉成員的最大值,則提升到能表示所有枚舉成員值的、大於int型的最小類型(unsigned int 、long或unsigned long)。

【學習資料】 《c++ primer》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM