2009-08-29 47 views

回答

18
int foo[10] = {0}; 

這是很細的:)


請注意,如果您執行以下操作:

int foo[10] = {1}; 

只有數組的第一個元素將被初始化爲非零數字,而其餘元素將被初始化爲零。

+1

@digitalross如果你根本沒有初始化一個自動聚合,那麼是的,它應該包含垃圾。問題是如果您使用{0}初始化一個聚合,它是一個auto還是不是。 – AraK 2009-08-30 01:24:38

27

在C/C++,如果你初始化只是已知大小的數組與價值的第一要素,其餘的將是零填充,所以:

int foo[10] = {0}; 

將不正是你想要的。

這也適用於結構:

struct bar { 
    int x; 
    int y; 
    char c; 
} myBar = {0}; 

將所有成員初始化爲0

標準(C99 - 6.7.8/12 - 初始化)這樣說:

如果大括號包含的列表中的初始化器數量少於聚集的元素或成員數量,或者用於初始化已知大小數組的數組中的字符串字符數少於數組中的元素,則剩餘的聚合的r應該被隱式地初始化爲具有靜態存儲持續時間的對象。

在C中,語法要求花括號裏至少有一個'賦值表達式'。 「賦值表達式」可以是許多事物,從常數或標識符到更復雜的表達式。然而,一個空字符串沒有資格作爲「賦值表達式」,所以大括號之間必須有一些東西。

在C++中,語法特別允許的「{}」的初始化,所以下面也將零初始化數組:

int foo[10] = {}; 

它可能還值得注意的是,在C++中沒有條目在初始化列表中有一個特定的初始化值將會是'value-initialized'或'default-initialized',它可能不同於零初始化,這取決於變量類型的構造函數是什麼以及編譯器是否遵循C + +98標準或C++ 03標準(這可能是C++ 98和C++ 03之間任何意義的唯一區別)。具有價值與默認初始化的整個情況相當複雜,因此如果您有興趣,請參閱以下答案:Do the parentheses after the type name make a difference with new?

幸運的是,這種差異似乎並沒有在實踐中造成太大的麻煩,但如果碰到它,它可能會導致一些頭部在試圖弄清楚什麼行爲真的應該是一團糟。我通常並不真正考慮它 - 這會讓我頭痛。

+0

從這個規則來看,它應該遵循甚至int foo [10] = {};對於10個零的數組就足夠了。 – UncleBens 2009-08-29 21:30:45

+1

@UncleBens - 在C中,語法要求至少有一個'賦值表達式',它可以是來自常量或標識符的許多事物,也可以是更復雜的表達式。然而,一個空字符串沒有資格作爲「賦值表達式」,所以大括號之間必須有一些東西。 C++語法特別允許「{}」初始值設定項。 – 2009-08-29 21:46:42

+1

@digitalross:這個由段落覆蓋「如果初始化器較少......聚合的其餘部分將被隱式地初始化爲與靜態存儲持續時間相同的對象。」 – 2009-08-30 03:41:31

0

在適用的情況下,初始化程序中未提及的所有元素都將初始化爲該類型的零值。

所以int foo [10] = {0};沒有提到的其餘元素也將是0

0

哇,C類似乎很簡單,但即使經過多年的引用規範,它是如此驚人的新東西仍然可以出現。

我剛剛在第一版spec(ANSI/ISO 9899-1990)中查到了它,當然,指定了一個自動聚合的其餘部分(6.5.7)「如果有更少...隱式初始化...「。

所以:任何非自動的。無論是否初始化,始終爲0(或初始化)。 自動:完全初始化,如果您初始化任何元素,否則,未初始化。

+2

@digitalross:你錯了。如果你讓本地人完全未初始化,它將被初始化。如果您使用初始化程序並初始化任何一個字段,則每個字段都將被初始化。 – 2009-08-30 01:34:56

+0

+1用於更正您的答案:) – AraK 2009-08-30 16:42:40

+0

嘿,謝謝! – DigitalRoss 2009-08-30 19:49:51