在C代碼我分析,有很多多維(結構)陣列的這些具有不同數量的大括號例如初始化{{0}}
或{{{0}}}
。初始化多維數組:{0}與{{{0}}}
然而,{0}
替換這些也完美的作品。
是否有使用大括號({}
)出現的一個或多個集合之間的(功能性)差?
在C代碼我分析,有很多多維(結構)陣列的這些具有不同數量的大括號例如初始化{{0}}
或{{{0}}}
。初始化多維數組:{0}與{{{0}}}
然而,{0}
替換這些也完美的作品。
是否有使用大括號({}
)出現的一個或多個集合之間的(功能性)差?
不,沒有功能差異。 C標準允許省略中間{}
。特別是{ 0 }
是一個可用於所有數據類型的初始化程序。
您有兩種選擇:{ 0 }
,適用於任何聚合或聯合類型,零初始化每個成員,或者使用必須正確對應所有成員的正確形式。
編號'{0}'即使對於標量類型也適用。 '{0}'和'{{{0}}}'沒有區別。 –
你說過「適用於任何集合或工會類型」。這不意味着如此嗎? –
@ P.P。 '{0}'對標量類型有效,但我從來沒有說過它不會。 – 2501
只是爲了重申延斯已經表示,{0}
適用於任何類型的。它是C中的「通用零初始值設定程序」。 參見C11草案,6.7.9 Initialization。
所以,初始化3D陣列或者{0}
或{{{0}}}
都可以使用。就個人而言,我會使用{0}
,因爲它更容易輸入和閱讀,適用於各種類型。這意味着,以下是所有有效的初始化:
int main(void)
{
int x = {0,};
int *p = {0,};
int *q = {0};
int arr[3][3][3][3] = {0};
}
更重要的是,如果你碰巧有一些未知/不透明的類型,例如從第三方庫,然後初始化它們是唯一可移植的方法 使用{0}
。任何其他的調零方法(例如使用memset()
或直接some_type_t state = 0;
)都需要一些關於所涉及類型的內部知識,並且風險是不可移植的。
如果您從另一個庫中獲得一個不透明類型,您不應該首先干涉它的內部部分,而是讓該庫初始化它。 – Lundin
[初始化與一個值整個2D陣列(http://stackoverflow.com/questions/15520880/initializing-entire-2d-array-with-one-value)應該回答爲什麼'{0}'作品。 – Lundin