7
votes

Initialisation de la matrice statique - Comment est-ce que je dois être verbose?

Pour initialiser un tableau INT avec tous les zéros, dois-je utiliser:

int foo[10] = {0};


0 commentaires

4 Réponses :


18
votes
int foo[10] = {1};

1 commentaires

@DigitalRoss Si vous n'initialisez pas du tout un agrégat automatique, alors, il doit contenir des ordures. La question est de savoir si vous initialisez un agrégat avec {0}, c'est une auto ou ce n'est pas.



27
votes

en C / C ++ si vous initiez simplement le premier élément d'un tableau de taille connue avec une valeur, le reste sera rempli de zéro, donc: xxx pré>

fera exactement ce que vous Vous voulez. p>

Cela fonctionne également pour les structures: p> xxx pré>

initialisera tous les membres à 0. p>

la norme (C99 - 6.7 .8 / 12 - Initialisation) dit ceci: p>

S'il y a moins d'initialiseurs dans une liste bloquée par une attelle que des éléments ou des membres d'un agrégat ou moins de caractères dans un littéral à chaîne utilisée pour initialiser un tableau de taille connue que des éléments de la matrice, le reste de L'agrégat doit être initialisé implicitement de la même manière que des objets ayant une durée de stockage statique. P> BlockQuote>

en C La grammaire nécessite qu'il y ait au moins une "expression d'affectation" à l'intérieur des accolades. Une «expression d'affectation» peut être de nombreuses choses d'une constante ou d'un identifiant à travers des expressions beaucoup plus complexes. Cependant, une chaîne vide ne se qualifie pas comme une "expression d'affectation", donc il doit y avoir quelque chose entre les accolades. p>

en C ++, la grammaire permet spécifiquement à l'initialiseur «{}», de sorte que les éléments suivants initialiseraient également la matrice: p>

int foo[10] = {};


4 commentaires

De cette règle, il devrait suivre que même int foo [10] = {}; suffit pour un tableau de 10 zéros.


@Unclebens - en C, la grammaire exige qu'il y ait au moins une "expression d'affectation", qui peut être de nombreuses choses à partir d'une constante ou d'un identifiant dans une expression plus complexe. Cependant, une chaîne vide ne se qualifie pas comme une "expression d'affectation", donc il doit y avoir quelque chose entre les accolades. La grammaire C ++ permet spécifiquement à l'initialiseur '{}'.


@DigitalRoss: Ceci est couvert par le paragraphe "S'il y a moins d'initialiseurs ... le reste de l'agrégat doit être initialisé implicitement de la même manière que des objets ayant une durée de stockage statique."


C99 Standard désalable {}. C ++ 11 Standard permet {}. GCC avec -std = C99 permet {}. GCC avec -pedantic désallows {}.



0
votes

Tous les éléments non mentionnés dans l'initialiszer seront initialisés à ce type de valeur nulle, le cas échéant.

donc int foo [10] = {0}; est bien, les éléments restants non mentionnés seront également 0


0 commentaires

0
votes

WOW, C type de semble être simple, mais même après des années de citation de la spécification, c'est incroyable comment quelque chose de nouveau peut encore se présenter.

Je viens de le regarder dans la première spécification d'édition (ANSI / ISO 9899-1990) et, bien sûr, le reste d'un agrégat automatique est spécifié (6.5.7) "s'il y a moins ... initialisé implicitement. .. ".

SO: quelque chose de non-auto. Toujours 0 (ou, comme initialisé), qu'il soit initialisé ou non. Auto: complètement initialisé si vous initialisez des éléments du tout, sinon, non initialisé.


1 commentaires

@DigitalRoss: Vous avez tort. Si vous laissez les locaux complètement ininitialisés, ce sera ininitialisé. Si vous utilisez une initiative et initialisez l'un des champs, chaque champ sera initialisé.