變數的初始化

什麼是變數的初始化?

下面的敘述都是:

  1. int x = -1;
  2. int *y = &x;
  3. float z[3] = {1.0, -2.1, 3.2};
  4. float z[5] = {1.0}; (與{1.0, 0.0, 0.0, 0.0, 0.0}相同)
  5. char *str = "Wednesday";
  6. char What[7] = "What"; (與 {'W', 'h', 'a', 't', 0, 0, 0} 相同)
  7. char Where[6] = {'W','h','e','r','e','\0'};
  8. double twoDim[2][3] = {{1,2,3},{4,5,6}}; (與 {1, 2, 3,4 , 5, 6} 相同)
  9. char a[2][5] = {"Sun", "Moon"};

變數的初始化敘述結合變數的宣告與設定敘述為一, 除了配置變數所需的記憶體空間, 並且將指定的數值置於該儲存區域內。

注意:

  1. 對於全域變數 (Global variable) 或是靜態變數 (Static variable) 而言, 初始化在整個程式的執行過程中只執行一次, 有時根本就存於程式檔案之中一併載入, 對於其它 auto 的變數而言, 則每一次在堆疊上重新配置儲存空間時都會初始化一次。

  2. 陣列變數初始化時如果在大括號中給的元素個數不夠時一律補 0, 不管是 char, int 或是 float 型態, 若是多給則編譯器會提示錯誤訊息 Too many initializers, 例如:int a[4] = {1, 2, 3, 4, 5, 6};。

  3. 如果在宣告陣列變數時沒有給元素的個數的話, 編譯器會自動去算大括號中有幾個初始化的元素, 就用這個數字來作為陣列中元素的個數, 例如:int a[] = {1, 2, 3, 4}; 或是 char a[][4] = {"Sun", "Moon", "Star"};

為什麼要初始化?

如果你辦了一張信用卡, 第一個月的帳單拿到時發現你還沒開始簽帳就已經欠了銀行十萬元, 這多可怕啊! 新的帳戶啟用時當然要把記錄清為 0 才對。

同樣地道理, 在程式內部要使用記錄資料的地方之前, 先把它打掃打掃清除乾淨也是應該的嘛!

那麼為什麼要用 int x=10; 的語法而不用

這兩個我們已經會用的語法就好了呢? 當然兩者的結果是一樣的, 只是使用後者的時候, 彈性太大了, 程式設計者可以把 x=10; 的敘述放在程式的任何地方, 也很容易忘記做這麼一件小小的事情。

請注意:

  1. 在 C 語言中, 對於基本型態的變數而言, 變數初始化和變數設定的外觀是很接近, 對於結構或是陣列變數來說, 差異就比較大了。

    結構

    陣列

  2. 在 C++ 中類別變數 (物件) 初始化所使用的 '=' 號和設定運算式中的 '=' 號完全不同, 必須分辨清楚。 例如: Student stud1 = stud2;

    呼叫拷貝建構元 Student(stud2) 建構新的物件,

    stud1 = stud2;

    則呼叫 operator=(stud2) 設定元函式。

程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw