隱式類型轉換由編譯器自動執行,不需程序員介入。
何時發生隱式類型轉換
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》