Initialisation d'un tableau de zéros
Il est bien connu que les initialiseurs manquants pour un tableau de scalaires sont par défaut à zéro.
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Mais est-ce (ci-dessous) garanti ?
int C[5]= { }; // All entries set to zero
3 réponses
L'initialisation étagée vide effectue l'agrégation-initialisation du tableau: cela conduit à l'initialisation zéro des éléments int
.
Oui, c'est garanti.
Oui, selon la règle de initialisation agrégée , Il est garanti (que tous les éléments du tableau {[1] } seront valeur initialisée , c'est-à-dire zéro initialisé à 0
dans ce cas).
(soulignement du mien)
Si le nombre de clauses d'initialisation est inférieur au nombre de membres
and bases (since C++17)
ou que la liste d'initialisation est complètement vide , les membres restantsand bases (since C++17)
sont initialisésby their default initializers, if provided in the class definition, and otherwise (since C++14)
par des listes vides, conformément à la règles d'initialisation de liste habituelles (qui effectue une initialisation de valeur pour les types non-classes et les classes non-agrégées avec des constructeurs par défaut, et une initialisation d'agrégat pour les agrégats).
PS:
int A[5]; // Entries remain uninitialized
"rester non initialisé" pourrait ne pas être exact. Pour int A[5];
, Tous les éléments de {[7] } seront initialisés par défaut . Si A
est statique ou objet thread-local, les éléments seront zéro initialisé à 0
, sinon rien n'est fait, ils indéterminée valeurs.
, En fait, quand vous ditesint A[5] = { 0 };
vous dites: initialisez le premier élément à zéro. Toutes les autres positions sont initialisées à zéro en raison de l'inizialisation agrégée.
Cette ligne est le vrai responsable d'avoir votre tableau plein de zéros: int A[5] = { };
C'est pourquoi si vous utilisez int A[5] = { 1 };
vous n'aurez que la première position inizialized à 1.