2012-07-22 350 views
2

我一直在使用數組。C++:數組元素設置爲0

我有幾個問題,我需要問。

現在我知道我不能使用一個數組而不給它的元素值。

例如,這會給我一個錯誤

int fly[5]; 
cout << fly[4] << endl; 

如果我打印不具有設定值的元素它會給出一個錯誤:

int fly[5]; 
fly[2] = 1; 
cout << fly[4] << endl; 

現在我發現,如果我在數組初始化中給出了數組中任意一個元素。隨後,其餘元素被設置爲0

所以這個代碼打印0

int fly[5] = {15}; 
cout << fly[4] << endl; 

爲什麼會發生這種情況。誰能解釋一下?

+0

無法引用此標準,但我相信如果未指定,初始化程序列表的其餘部分默認爲0。 (此外,您提供的示例不是錯誤,而是未定義的行爲[行爲已定義,但數組的內容不是]。) – Corbin 2012-07-22 22:43:09

+0

根據標準,如果您有數組初始值設定項,但不要不指定某些元素,其餘部分爲0. – Shahbaz 2012-07-22 22:45:49

回答

4

這是因爲C++語言標準認爲應該發生。該標準說它應該發生,因爲它是合理的行爲,並且在想要初始化大型數組的情況下可以節省大量輸入。

你的第一個例子產生未定義的行爲,因爲這些數組元素的值可以是任何東西,但它們不應該「給出錯誤」。 (一個足夠聰明的編譯器可能會發出警告。)

+0

IMO編譯器**應該爲未定義的行爲生成錯誤。 – 2012-07-22 22:48:44

+0

我不清楚那一個。我使用Visual C++ Express。因此它會打印一條錯誤消息,以便中斷或繼續。這就是我的意思是一個錯誤。 – 2012-07-22 23:03:28

+1

@LuchianGrigore:那會很好,但行爲未定義的構造往往是那些在所有情況下都很難甚至不可能發現的構造。例如,'i ++ + i ++'很容易檢測,但是'arr [i] ++ + arr [j] ++'只有在'i == j'時纔有未定義的行爲。編譯器當然可以警告未定義行爲的代碼,或者如果他們能證明行爲未定義,則拒絕它。由於必須執行額外的分析,啓用優化通常會幫助編譯器檢測這種情況。 – 2012-07-22 23:16:20

2

首先,你的前兩個例子不能保證給出錯誤。如果他們不這樣做,他們會編譯並運行未定義的行爲。最後一個有明確的行爲。如果您沒有爲數組的每個元素指定值,則其餘部分將使用默認值進行初始化,在這種情況下爲0.

0

當你大括號初始化一個數組並且初始值設定項太短時,缺少的元素會被初始化。對於原始類型,如int,這意味着零初始化(即初始值爲零)。例如,你可以說int a[100] = {};得到一個全零數組。然而,整數並不是特別的,這也適用於默認構造的類類型。

您的前兩個示例構成未定義的行爲,因爲您正在讀取未初始化的變量。