1. 程式人生 > >c++類型轉換

c++類型轉換

取地址 bsp string類 程序員 初始化 chart con 自動 typeid

如果兩種類型可以相互轉換,它們就是關聯的。c++語言不會直接將兩種不同類型的值相加,而是先根據類型轉換規則及那個運算對象的類型統一後再求值。

1、隱式轉換

隱式轉換的類型轉換是自動執行的,無須程序員介入。在下面的情況下,編譯器會執行隱式轉換:

  • 大多數表達式中,比int類型小的整型值首先提升為較大的整數類型。
  • 條件表達式中,非布爾型轉換成布爾型。
  • 初始化時,初始值變成變量類型。
  • 賦值語句中,右側對象轉換成左側對象的類型。
  • 函數調用時發生的類型轉換。

(1)算術轉換

(1.1)整型提升

將小整數類型轉換成較大的整數類型,對bool、char、signed char、unsigned char、short和unsigned short等類型來說,只要它們所有可能的值都存在int裏,它們就會提升成int型,否則提升成unsigned int型;對較大的char類型(wchart_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long和unsigned long long中最小的一種類型,前提是轉換後的類型能容納原類型所有可能的值。

(1.2)轉換規則

算數轉換將運算對象換成最寬的類型,比如表達式中既有整型又有浮點型,運算時會將整型變換成浮點型進行運算。算術運算首先執行整型提升,如果提升後的類型一致則不需要進一步的類型轉換,否則要執行類型轉換。如果運算對象符號一致,要麽都是無符號的、要麽都是有符號的,則小類型運算對象轉換成較大類型。否則,符號不一致(含有無符號類型的)的運算則需要註意:

  • 無符號的類型不小於帶符號類型的(無符號類型大),則帶符號對象轉換成無符號的。
  • 無符號類型小於帶符號類型(無符號類型小),轉換結果依賴機器:如果無符號類型的所有值都能存在該帶符號類型中,則無符號對象轉換成帶符號類型,否則,帶符號對象轉換成無符號的類型。

(2)其他轉換

  • 數組轉換成指針

但當數組被用作decltype關鍵字的參數、取地址符(&)、sizeof、typeid等運算符的運算對象時,轉換不會發生。

  • 函數類型自動轉換成函數指針。
  • 算數類型或指針類型自動轉換成布爾類型:

    char *cp=get_char();

    if(cp);//如果指針不是0,為真

    if(*cp);//如果指針指向的值不是空字符,為真

  • 非常量類型的指針(或引用)轉換成常量類型:

    int i;

    const int &j=i;/非常量轉換成常量的引用

    const int *p=&i;//非常量轉換成指向常量的指針

  • 類類型定義的轉換

  string s="a value";//字符串字面值轉換成string類型

  while(cin>>s);//cin轉換成bool值

2、顯式轉換

暫時不看

c++類型轉換