2、變量和基本類型

2、變量和基本類型

  • 1.算術類型
    • C++規定sizeof(int)>=sizeof(short),sizeof(long)>=sizeof(int),sizeof(long long)>sizeof(long),long long是C++11中新定義的
    • double比float擴展了精度值,計算代價相差無幾甚至更快,long double基本沒必要的且帶來的耗時也不容忽視
    • 需要注意的是,char、signed char、unsigned char三者是不一樣的,雖然char會表現爲後兩者之一,但具體是由編譯器決定的
    • C++沒有約定帶符號的類型如何表示但約定了正值和負值的量應該平衡

    • 無法預知和依賴於實現環境的行爲:無法預知的行爲源於編譯器無須(有時是不能)檢測的錯誤,程序也應儘量避免依賴於實現環境的行爲,如把int的尺寸看做是確定不變的,看下錶。

      原文:https://sourceforge.net/p/predef/wiki/DataModels/

      Data type LP32 ILP32 LP64 LLP64 ILP64 SILP64
      char 8 8 8 8 8 8
      short 16 16 16 16 16 64
      int 16 32 32 32 64 64
      long 32 32 64 32 64 64
      long long 64 64 64 64
      pointer 32 32 64 64 64 64
    • 1.2.字面值常量
      • 如果兩個字符串字面值位置緊鄰且僅由空格、縮進和換行符分隔,則實際是一個整體。
      • 轉義序列
        • \a,報警響鈴符,\b,退格符,\f,進紙符,\v,縱向製表符
        • 泛化轉義序列:\x後緊跟1個或多個十六進制數,或\後緊跟1/2/3個8進制數
      • 指定字面值類型:前綴(u/U/L/u8)、後綴(uU lL(long/long Double) fF llLL)
  • 2.變量

C++的每個變量都有類型,決定了所佔空間大小和佈局方式和能參與的運算

  • 變量的定義(下面4種初始化方式都是可以的)
    int a1 = 0;
    int a2 = {0};
    int a3{0};  //列表初始化,存在丟失風險時將報錯
    int a4(0);
    
  • 變量聲明和定義的關係
    • 聲明規定類型和名字,定義還申請空間、賦值
      • 聲明:由一個基本類型(base type)和一個聲明符(declarator)列表組成
  • 2、複合類型
    • 2.1 引用:爲對象起+ 90另外一個名字
      int ival = 1024;
      int &refVal = ival;
      
    • 2.2 指針,實現了對其他對象的間接引用
      • 空指針
        • :char *p1 = nullptr,*p2 = 0,*p3 = NULL;都可生成空指針
        • nullptr是一種特殊類型的字面值
        • NULL是預處理變量,和0一樣
      • void *指針:可存放任意對象的地址
    • 2.3 複合類型申明

      變量定義:基本數據類型+一組聲明符(類型修飾符)

      int i=0,*p=&i,&r=i; //一條定義語句,一個基本數據類型可定義出不同類型的變量

      • 指向指針的引用:引用不是對象,所以不能定義指向引用的指針,但指針是對象(從右向左讀)

        int p,&r=p;//r是對指針p的引用

    • 2.4 const 限定符

      默認情況下,const對象僅在文件內有效,C++允許:對於connst變量不管是聲明還是定義都加上extern關鍵字(gcc編譯會報錯)

      • const的引用:const int &r1 = ci;//不能修改綁定的對象
      • 引用的類型必須與其所引用的對象一致,except①初始化常量引用時允許用任意表達式做初始值 ②允許常量引用綁定非常量對象、字面值、表達式
      • 常量表達式:值不變,編譯過程中能得到計算結果

        const int a = 1;//常量表達式

        int b = 1;//非常量表達式

        const int c = getSize();//非常量表達式(運行時才能獲取值)

      • 可用constexpr修飾常量表達式
        • 指針必須被聲明成nullptr或0
        • 函數體內定義的變量不存放在固定地址,不能用它修飾
        • const int *p = nullptr; //指向整型常量的指針
        • constexpr int *q = nullptr; //指向整數的常量指針,等效於 int *const q
    • 2.5 處理類型
      • 類型別名
        typedef char * pstring;
        const pstring p1 = 0;
        const char *p2 = 0;//注意這個類型和上面的不一樣
        
      • auto類型說明符

        通過初始值推斷變量的類型,會忽略頂層const,保留底層const

      • decltype類型指示符

        選擇並返回操作數的數據類型(包括頂層const和引用在內)

    • 2.6 自定義數據結構
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章