web-dev-qa-db-fra.com

Initialiser un tableau de zéros

Il est bien connu que les initialiseurs manquants pour un tableau de scalaires ont la valeur zéro par défaut.

int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero

Mais est-ce garanti (ci-dessous)?

int C[5]= { }; // All entries set to zero
53
Yves Daoust

L’initialisation par contreventement vide effectue l’agrégation-initialisation du tableau: ceci conduit à une initialisation nulle des éléments int.

Oui, c'est garanti.

67
Bathsheba

Oui, selon la règle de initialisation d'agrégat , il est garanti (que tous les éléments du tableau C seront valeur initialisée , c'est-à-dire zéro -initialisé à 0 dans ce cas).

(c'est moi qui souligne)

Si le nombre de clauses d'initialisation est inférieur au nombre de membres and bases (since C++17) ou la liste d'initialiseur est complètement vide , les membres restants and bases (since C++17) sont initialisés by their default initializers, if provided in the class definition, and otherwise (since C++14) par des listes vides, conformément aux règles habituelles d'initialisation de liste (qui effectue l'initialisation de valeur pour les types non-classes et les classes non-agrégées avec des constructeurs par défaut, et l'initialisation des agrégats pour les agrégats).


PS:

int A[5]; // Entries remain uninitialized

"rester non initialisé" pourrait ne pas être précis. Pour int A[5];, Tous les éléments de A seront initialisés par défaut . Si A est un objet statique ou thread-local, les éléments seront initialisés à zéro à 0, Sinon rien n'est fait, ce sont des valeurs indéterminées.

35
songyuanyao

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 globale.

Cette ligne est la vraie responsable d'avoir votre tableau plein de zéros: int A[5] = { };

C'est pourquoi si vous utilisez int A[5] = { 1 }; vous aurez seulement la première position initialisée à 1.

2
rain_