?
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
對(duì)象的聲明可以通過稱為初始化的過程提供其初始值。
對(duì)于每個(gè)聲明符,如果不省略,初始化符可能是以下之一:
= expression | (1) | |
---|---|---|
= { initializer-list } | (2) |
其中 initializer-list 是一個(gè)非空的以逗號(hào)分隔的初始化器列表(帶有可選的尾隨逗號(hào)),其中每個(gè)初始化器都有三種可能的形式之一:
expression | (1) | |
---|---|---|
{ initializer-list } | (2) | |
designator-list = initializer | (3) |
其中,指定者列表是表單標(biāo)識(shí)符的[
常量表達(dá)式]
或結(jié)構(gòu)/聯(lián)合成員指示符形式的數(shù)組指示符的列表.
; 請(qǐng)參閱數(shù)組初始化和結(jié)構(gòu)初始化
初始化程序指定存儲(chǔ)在對(duì)象中的初始值。
如果提供了初始化程序,請(qǐng)參閱。
標(biāo)量類型初始化的標(biāo)量初始化
數(shù)組初始化用于數(shù)組類型的初始化
結(jié)構(gòu)初始化用于結(jié)構(gòu)和聯(lián)合類型的初始化。
如果未提供初始化程序:
具有自動(dòng)存儲(chǔ)持續(xù)時(shí)間的對(duì)象被初始化為不確定的值(可能是陷阱表示)
具有靜態(tài)和線程局部存儲(chǔ)持續(xù)時(shí)間的對(duì)象按如下進(jìn)行初始化
指針被初始化為它們類型的空指針值
整型的對(duì)象被初始化為無符號(hào)零
浮動(dòng)類型的對(duì)象被初始化為正零
數(shù)組成員,結(jié)構(gòu)體和聯(lián)合體如上所述進(jìn)行初始化,遞歸地加上所有填充位被初始化為零
(在空指針和浮點(diǎn)零都具有全零位表示的平臺(tái)上,靜態(tài)初始化的這種形式通常通過在程序映像的.bss節(jié)中分配來實(shí)現(xiàn))
初始化靜態(tài)或線程局部存儲(chǔ)持續(xù)時(shí)間的對(duì)象時(shí),初始化程序中的每個(gè)表達(dá)式都必須是常量表達(dá)式或字符串常量。
初始化器不能用于不完整類型的對(duì)象,VLA 和具有鏈接的塊范圍對(duì)象的聲明。
函數(shù)參數(shù)的初始值是通過從函數(shù)調(diào)用的參數(shù)中分配而不是通過初始化(直到C11之后的缺陷報(bào)告 DR 427,其改變了使用初始化的措辭)而建立的。
如果將不確定值用作任何標(biāo)準(zhǔn)庫(kù)調(diào)用的參數(shù),則行為是未定義的。否則,任何涉及不確定值的表達(dá)式的結(jié)果都是不確定的值(例如,int n;可能不會(huì)與自身等同,并且可能會(huì)在后續(xù)讀取中更改它的值)。
#include <stdlib.h>int a[2]; // initializes a to {0, 0}int main(void){ int i; // initializes i to an indeterminate value static int j; // initializes j to 0 int k = 1; // initializes k to 1 // initializes int x[3] to 1,3,5 // initializes int* p to &x[0] int x[] = { 1, 3, 5 }, *p = x; // initializes w (an array of two structs) to // { { {1,0,0}, 0}, { {2,0,0}, 0} } struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2}; // function call expression can be used for a local variable char* ptr = malloc(10); free(ptr); // Error: objects with static storage duration require constant initializers// static char* ptr = malloc(10); // Error: VLA cannot be initialized// int vla[n] = {0};}
C11 standard (ISO/IEC 9899:2011):
6.7.9 Initialization (p: 139-144)
C99 standard (ISO/IEC 9899:1999):
6.7.8 Initialization (p: 125-130)
C89/C90 standard (ISO/IEC 9899:1990):
3.5.7 Initialization