C 中變數的初始化
在沒有顯式初始化的情況下,外部和 static
變數保證初始化為零; 自動變數(包括 register
變數)具有不確定的 1 (即垃圾)初始值。
標量變數可以通過使用等號和表示式跟隨名稱來定義:
int x = 1;
char squota = '\'';
long day = 1000L * 60L * 60L * 24L; /* milliseconds/day */
對於 external 和 static
變數,初始值設定項必須是常量表示式 2 ; 在程式開始執行之前,概念上完成初始化一次。
對於 automatic 和 register
變數,初始值設定項不限於常量:它可以是涉及先前定義的值的任何表示式,甚至是函式呼叫。
例如,請參閱下面的程式碼段
int binsearch(int x, int v[], int n)
{
int low = 0;
int high = n - 1;
int mid;
...
}
代替
int low, high, mid;
low = 0;
high = n - 1;
實際上,自動變數的初始化只是賦值語句的簡寫。更喜歡哪種形式主要是品味問題。我們通常使用顯式賦值,因為宣告中的初始化器更難以檢視並且遠離使用點。另一方面,只有在可能的情況下才能使用變數。
初始化陣列:
可以通過跟隨其宣告來初始化陣列,其中初始化器列表用大括號括起來並用逗號分隔。
例如,要使用每月的天數初始化陣列天數:
int days_of_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
(注意,1 月在此結構中編碼為月零。)
當省略陣列的大小時,編譯器將通過計算初始值來計算長度,在這種情況下,初始值為 12。
如果陣列的初始值設定項少於指定的大小,則對於所有型別的變數,其他的初始值設定項將為零。
擁有太多初始值設定項是錯誤的。沒有標準方法來指定初始化程式的重複 - 但 GCC 有一個擴充套件來執行此操作。
Version < C99
在 C89 / C90 或更早版本的 C 中,無法在不提供所有前面的值的情況下初始化陣列中間的元素。
Version >= C99
使用 C99 及更高版本,指定的初始化程式允許你初始化陣列的任意元素,將任何未初始化的值保留為零。
初始化字元陣列:
字元陣列是初始化的特例; 可以使用字串代替大括號和逗號表示法:
char chr_array[] = "hello";
是一個較長但相當的簡寫:
char chr_array[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
在這種情況下,陣列大小為六(五個字元加上終止'\0'
)。
2 請注意,常量表示式定義為可在編譯時計算的值。所以,int global_var = f();
無效。另一個常見的誤解是將 const
限定變數視為常量表示式。在 C 中,const
表示只讀,而不是編譯時間常數。因此,像 const int SIZE = 10; int global_arr[SIZE];
和 const int SIZE = 10; int global_var = SIZE;
這樣的全域性定義在 C 中是不合法的。