2012-11-08 138 views
2

這個代碼是否初始化全部數組元素全部是主要的C和C++編譯器還是不是?C/C++中的數組初始化

int arr[100] = {0}; 
+1

這是一樣的'= {}',但不一樣'= {1}'或其他任何這是不是零。 –

回答

6

在所有編譯器中。這由C標準和C++標準保證。

例如,對於C這裏是有關段落:

(C99,6.7.8p21)「如果有在大括號內的列表更少初始化值多於一個聚合的元件或部件,或用於初始化已知大小的數組的字符串字符串中的字符數,而不是數組中的元素,聚合的其餘部分應隱式地初始化爲具有靜態存儲持續時間的對象。

(C99,6.7.8p10)「如果具有自動存儲持續時間的對象沒有被明確初始化,它的值是不確定的。如果具有靜態存儲持續時間的對象沒有被初始化明確,則:[...],如果它有算術類型,它被初始化爲(正或無符號的)零; [...]」

+0

aha,tnx。 那麼int arr [100] = {1}'的結果是什麼? – MBZ

+4

@MBZ數組的第一個元素初始化爲「1」,所有其餘元素初始化爲「0」。 – ouah

+0

@Patatoswatter我認爲你應該再次閱讀報價。它從不假定陣列具有靜態存儲持續時間。引用基本上規定,如果一個數組的初始值設定項比數組元素的數目少,那麼其餘的元素將被初始化爲它們在靜態數組中使用的默認值。對於靜態'int'元素,默認值是'0'。 – ouah

1

如果陣列恰好是陣列結構,你會很快遇到問題。哎呀,你甚至不能做一個單一的結構。

這個簡單的示例說明兩個主要編譯器(GCC和MSVC)按照規格在ouah的回答引用(GCC 貌似,從它的警告,並從其錯誤味精MSVC)。

考慮這個源,foo.c的/ Foo.cpp中:

void foo(void) { 
    struct A { 
     int i; 
     int j; 
    }; 
    struct A single = {0}; 
} 

編譯,與兩個gcc和g ++:

$ gcc -Wall -W -c foo.c 
foo.c: In function 'foo': 
foo.c:6:14: warning: missing initializer 
foo.c:6:14: warning: (near initialization for 'single.j') 

$ g++ -Wall -W -c foo.cpp 
foo.cpp: In function 'void foo()': 
foo.cpp:6:27: warning: missing initializer for member 'foo()::A::j' 

相同的警告給予陣列。這個gcc只有兩歲:gcc --version - >gcc (GCC) 4.5.3

Plain {}沒有在gcc中正常工作,包括陣列。並且您始終可以使用-w(小寫)進行編譯以禁用所有警告。

但是MSVS 2012具有相等且相反的問題此實例(包括數組)。

喜歡{0},和治療{}錯誤

Error C2059: syntax error : '}' 
+0

對不起,我不太明白。 GCC不遵循規範的方式? – jogojapan

+0

@jogojapan:我認爲GCC ***確實遵循了規範。我應該更清楚一點。我有一個關於可怕的'-w'開關的早期訣竅。但是這篇文章只是關於***警告,***不是關於真正的代碼生成(除了msvc)。 –

+0

也許你在編輯問題時忽略了這一點,但它仍然說_two主要編譯器(gcc和msvc)不遵循規範_。你有意改變這個嗎? (如果我確定這是你的意圖,我會自己去做。) – jogojapan