C++中的基本變數型別介紹

CurryCoder發表於2019-03-14

1.cpp變數型別

  • 變數實際上是儲存空間的名稱,cpp中每個變數都有指定的型別,型別決定變數儲存的大小和佈局,該範圍內的值都可以儲存在記憶體中,運算子可以作用在變數上。
  • 變數名可以是字母 數字 下劃線組成,必須以字母或下劃線開頭。區分大小寫
  • 幾種基本的變數型別:
    基本的變數型別.png

2.cpp中的變數定義

  • 變數定義就是告訴編譯器在何處建立變數的儲存,以及如何建立變數的儲存。變數的定義指定一個資料型別,幷包含該型別的一個或多個變數的列表,例如:
    格式:type variable_list;
    
  • type必須是基本資料型別或使用者自定義的資料型別(如 類),variable_list可以由一個或多個識別符號名稱組成,多個識別符號之間用逗號分隔,例如:
    int i, j, k;  // 宣告並定義了變數i, j, k,指示編譯器建立型別為int的名為i,j,k的變數 
    char c, d, e;
    float f, ss;
    double d;
    
  • 變數可以在宣告的時候被初始化,初始化器由一個等號後跟一個常量表示式組成,例如:
    格式:  type variable_name = value;
    extern int d = 3, f = 6;  // d 和 f 的宣告
    int d = 3, f = 5;  // 定義並初始化 d 和 f
    byte z = 22;
    char x = 'x';
    
  • 不帶初始化的定義:帶有靜態儲存持續時間的變數會被隱式初始化為 NULL(所有位元組的值都是 0),其他所有變數的初始值是未定義的

3.cpp中的變數宣告

  • 變數宣告向編譯器保證變數以給定的型別和名稱存在,這樣編譯器在不需要知道變數完整細節的情況下也能繼續進一步的編譯。變數宣告只在編譯時有它的意義,在程式連線時編譯器需要實際的變數宣告。
  • 當使用多個檔案且只在其中一個檔案中定義變數時(定義變數的檔案在程式連線時是可用的),變數宣告就顯得非常有用。您可以使用 extern 關鍵字在任何地方宣告一個變數。雖然您可以在 C++ 程式中多次宣告一個變數,但變數只能在某個檔案、函式或程式碼塊中被定義一次。
int main(){
    // 變數的定義
    int a, b;
    int c;
    float f;
    // 實際初始化
    a = 10;
    b = 20;
    c = a + b;
    cout << c << endl;
    f = 70.0 / 3.0;
    cout << f << endl;
    return 0;
}
  • 同樣的,在函式宣告時,提供一個函式名,而函式的實際定義則可以在任何地方進行。
// 變數的宣告
extern int a, b;
extern int c;
extern float f;

// 函式宣告
int func();



int main(){
    // 變數的定義
    int a, b;
    int c;
    float f;
    // 實際初始化
    a = 10;
    b = 20;
    c = a + b;
    cout << c << endl;
    f = 70.0 / 3.0;
    cout << f << endl;

    // 函式呼叫
    int i = func();
    return 0;
}

// 函式定義
int func(){
    return 0;
}

4.cpp中的左值和右值

  • cpp中的兩種型別的表示式:
    • 左值:指向記憶體位置的表示式被稱為左值(lvalue)表示式。左值可以出現在賦值號的左邊或右邊。
    • 右值:儲存在記憶體中某些地址的數值。右值是不能對其進行賦值的表示式,也就是說,右值可以出現在賦值號的右邊,但不能出現在賦值號的左邊。
  • 變數是左值,因此可以出現在賦值號的左邊。數值型的字面值是右值,因此不能被賦值,不能出現在賦值號的左邊。
int g = 20;
10 = 20;  報錯!

5.變數的型別轉換

  • 變數的型別間是可以互相轉換的,轉換又分為自動轉換和強制轉換。
    • 自動轉換規則

      • 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。
      • 轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。
        • a、若兩種型別的位元組數不同,轉換成位元組數高的型別
        • b、若兩種型別的位元組數相同,且一種有符號,一種無符號,則轉換成無符號型別
      • 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表示式,也要先轉換成double型,再作運算。
      • char型和short型參與運算時,必須先轉換成int型。
      • 在賦值運算中,賦值號兩邊量的資料型別不同時,賦值號右邊量的型別將轉換為左邊量的型別。如果右邊量的資料型別長度比左邊長時,將丟失一部分資料,這樣會降低精度:
           int aa = 1;
          double bb = 2.1;
          aa = bb;
          cout << "aa = " << aa << endl;  //輸出為 2,丟失小數部分
      
          int a = 1;
          double b = 2.1;
          cout << "a + b = " << a + b << endl;  //輸出為a + b = 3.1
      
    • 強制轉換規則

      • 強制型別轉換是通過型別轉換運算來實現的。其一般形式為:**(型別說明符)(表示式)**其功能是把表示式的運算結果強制轉換成型別說明符所表示的型別
          int a = 1;
          double b = 2.1;
          cout << "a + b = " << a + (int)b << endl;  //輸出為a + b = 3
      

6.變數定義與宣告的區別

  • 定義包含了宣告,但是宣告不包含定義,變數宣告是不會為變數開闢記憶體空間的,只有當宣告也是定義時,宣告才可以有初始化,初始化必須有儲存空間來進行初始化。如:
int a = 0;     //定義並宣告瞭變數 a
extern int a;  //只是宣告瞭有一個變數 a 存在,具體 a 在哪定義的,需要編譯器編譯的時候去找。

相關文章