當您初始化純量類型時,會將的值 assignment-expression 指派給 變數。 指派的轉換規則適用。 (如需轉換規則的資訊 ,請參閱類型轉換 。
語法
declaration:
declaration-specifiers
init-declarator-list
選擇;
declaration-specifiers:
storage-class-specifier
declaration-specifiers
選擇
type-specifier
declaration-specifiers
選擇
type-qualifier
declaration-specifiers
選擇
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer /* 純量初始化 */
initializer:
assignment-expression
只要遵守下列規則,您就可以初始化任何類型的變數:
您可以在檔案範圍層級宣告的變數初始化。 如果您未在外部層級明確初始化變數,則預設會初始化為 0。
常數表達式可用來初始化以
staticstorage-class-specifier宣告的任何全域變數。 宣告為的變數會在static程序執行開始時初始化。 如果您未明確初始化全域static變數,則預設會將其初始化為0,且具有指標類型的每個成員都會指派Null指標。每次執行控件傳遞至宣告它們的區塊時,都會初始化以
auto或register儲存類別規範宣告的變數。 如果您從 或auto變數的register宣告中省略初始化表達式,則未定義變數的初始值。 針對自動和緩存器值,初始化表達式不限於為常數;它可以是任何涉及先前定義值的表達式,甚至是函數調用。外部變數宣告和所有
static變數的初始值,無論是外部或內部,都必須是常數表達式。 如需詳細資訊,請參閱 常數表達式。 由於任何外部宣告或靜態變數的位址都是常數,所以可以用來初始化內部宣告的static指標變數。 不過,變數的auto位址不能當做靜態初始化表達式使用,因為每個區塊的執行可能都不同。 您可以使用常數或變數值來初始化auto和register變數。如果標識符的宣告具有區塊範圍,而且標識碼具有外部連結,則宣告不能有初始化。
範例
下列範例說明初始化:
int x = 10;
整數變數 x 會初始化為常數表示式 10。
register int *px = 0;
px指標初始化為 0,產生 “null” 指標。
const int c = (3 * 1024);
這個範例會使用常數表達式 (3 * 1024) 初始化 c 為因為 關鍵詞而無法修改的 const 常數值。
int *b = &x;
這個語句會使用另一個變數 b的位址,初始化指標x。
int *const a = &z;
a指標會以名為z的變數位址初始化。 不過,因為它指定為 const, a 所以變數只能初始化,永遠不會修改。 它一律指向相同的位置。
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
全域變數 GLOBAL 會在外部層級宣告,因此其具有全域存留期。 局部變數 LOCAL 具有 auto 儲存類別,而且在執行宣告它的函式時,只有一個位址。 因此,不允許嘗試使用 的位址static初始化lp指標變數LOCAL。
static指標變數gp可以初始化為 的位址,因為該位址GLOBAL一律相同。 同樣地, *rp 可以初始化,因為 rp 是局部變數,而且可以有非常數初始化表達式。 每次輸入區塊時, LOCAL 都有新的位址,然後指派給 rp。