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')。

1 C 中宣告的未初始化變數會發生什麼?它有價值嗎?

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 中是不合法的。