變數的初始化
什麼是變數的初始化?
下面的敘述都是:
-
int x = -1;
-
int *y = &x;
-
float z[3] = {1.0, -2.1, 3.2};
-
float z[5] = {1.0}; (與{1.0, 0.0, 0.0, 0.0, 0.0}相同)
-
char *str = "Wednesday";
-
char What[7] = "What"; (與 {'W', 'h', 'a', 't', 0, 0, 0} 相同)
-
char Where[6] = {'W','h','e','r','e','\0'};
-
double twoDim[2][3] = {{1,2,3},{4,5,6}}; (與 {1, 2, 3,4 , 5, 6} 相同)
-
char a[2][5] = {"Sun", "Moon"};
變數的初始化敘述結合變數的宣告與設定敘述為一,
除了配置變數所需的記憶體空間,
並且將指定的數值置於該儲存區域內。
注意:
-
對於全域變數 (Global variable)
或是靜態變數 (Static variable) 而言,
初始化在整個程式的執行過程中只執行一次,
有時根本就存於程式檔案之中一併載入,
對於其它 auto 的變數而言,
則每一次在堆疊上重新配置儲存空間時都會初始化一次。
-
陣列變數初始化時如果在大括號中給的元素個數不夠時一律補 0,
不管是 char, int 或是 float 型態,
若是多給則編譯器會提示錯誤訊息 Too many initializers,
例如:int a[4] = {1, 2, 3, 4, 5, 6};。
-
如果在宣告陣列變數時沒有給元素的個數的話,
編譯器會自動去算大括號中有幾個初始化的元素,
就用這個數字來作為陣列中元素的個數,
例如:int a[] = {1, 2, 3, 4}; 或是
char a[][4] = {"Sun", "Moon", "Star"};
為什麼要初始化?
如果你辦了一張信用卡,
第一個月的帳單拿到時發現你還沒開始簽帳就已經欠了銀行十萬元,
這多可怕啊!
新的帳戶啟用時當然要把記錄清為 0 才對。
同樣地道理,
在程式內部要使用記錄資料的地方之前,
先把它打掃打掃清除乾淨也是應該的嘛!
那麼為什麼要用 int x=10; 的語法而不用
這兩個我們已經會用的語法就好了呢?
當然兩者的結果是一樣的,
只是使用後者的時候,
彈性太大了,
程式設計者可以把 x=10; 的敘述放在程式的任何地方,
也很容易忘記做這麼一件小小的事情。
請注意:
-
在 C 語言中,
對於基本型態的變數而言,
變數初始化和變數設定的外觀是很接近,
對於結構或是陣列變數來說,
差異就比較大了。
結構:
typedef
struct StudentTag
{
int id;
char name[20];
} Student;
-
初始化:
Student student1={1,"john"}, student2={2,"mary"};
或是
struct StudentTag student1={1,"john"}, student2={2,"mary"};
-
程式內部設定:
Student student1,student2;
student1.id=1, strcpy(student1.name,"john");
student2.id=2, strcpy(student2.name,"mary");
陣列:
-
初始化:
int x[3][2][2] = {{{1,2},{3,4}},
{{5,6},{7,8}},
{{9,10},{11,12}}};
-
程式內部設定:
int m, i, j, k, x[3][2][2];
m = 1;
for (i=0; i<3; i++)
for (j=0; j<2; j++)
for (k=0; k<2; k++)
x[i][j][k] = m++;
-
在 C++ 中類別變數 (物件) 初始化所使用的 '='
號和設定運算式中的 '='
號完全不同,
必須分辨清楚。
例如:
class Student
{
public:
Student(Student& src);
Student & operator=(Student& src);
private:
int id;
char name[10];
};
Student stud1 = stud2;
呼叫拷貝建構元 Student(stud2) 建構新的物件,
stud1 = stud2;
則呼叫 operator=(stud2) 設定元函式。