2009-08-29 7 views

Répondre

18
int foo[10] = {0}; 

Ceci est très bien :)


Notez que si vous faites ce qui suit:

int foo[10] = {1}; 

Seul le premier élément du tableau sera initialisé avec le nombre différent de zéro tandis que le reste sera initialisé avec des zéros.

+1

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

27

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

int foo[10] = {0}; 

fera exactement ce que vous voulez.

Cela fonctionne aussi pour struct:

struct bar { 
    int x; 
    int y; 
    char c; 
} myBar = {0}; 

REINITIALISERA tous les membres à 0.

La norme (C99 - 6.7.8/12 - Initialisation) dit ceci:

S'il y a moins d'initialiseurs dans une liste d'accolades que s'il y a des éléments ou des membres d'un agrégat, ou moins de caractères dans un littéral de chaîne utilisé pour initialiser un tableau de taille connue qu'il y a d'éléments dans le tableau, r de l'agrégat doit être initialisé implicitement de la même manière que les objets ayant une durée de stockage statique.

En C, la grammaire requiert qu'il y ait au moins une 'affectation-expression' à l'intérieur des accolades. Une 'affectation-expression' peut être beaucoup de choses d'une constante ou d'un identificateur à travers des expressions beaucoup plus complexes. Cependant, une chaîne vide ne peut pas être considérée comme une 'expression d'affectation', il doit donc y avoir quelque chose entre les accolades.

En C++, la grammaire permet spécifiquement la « {} » initialiseur, de sorte que le suivant serait zéro initialiser aussi le tableau:

int foo[10] = {}; 

Il est probablement aussi intéressant de noter que dans C++ les entrées qui ne sont pas avoir une valeur d'initialisation spécifique dans la liste d'initialisation sera 'initialisée par la valeur' ​​ou 'initialisée par défaut' qui pourrait être différente de zéro initialisée en fonction de ce que sont les constructeurs pour le type de variable et si le compilateur suit le C + +98 standard ou le standard C++ 03 (c'est probablement la seule différence significative entre C++ 98 et C++ 03). L'ensemble de la situation avec la valeur par rapport à l'initialisation par défaut est plutôt compliqué, donc si vous êtes intéressé voir cette réponse: Do the parentheses after the type name make a difference with new?. Heureusement, la différence ne semble pas causer beaucoup de problèmes en pratique, bien que si vous y tombiez, cela causerait probablement un peu de grattage pendant un moment en essayant de deviner quel devrait être le comportement. D'habitude, je n'y pense pas beaucoup, ça me fait mal à la tête.

+0

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

+1

@UncleBens - en C la grammaire exige qu'il y ait au moins une 'affectation-expression', qui peut être beaucoup de choses d'une constante ou d'une identification à travers une expression plus complexe. Cependant, une chaîne vide ne peut pas être considérée comme une 'expression d'affectation', il doit donc y avoir quelque chose entre les accolades. La grammaire C++ autorise spécifiquement l'initialiseur '{}'. –

+1

@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 les objets qui ont une durée de stockage statique." –

0

tous les éléments non mentionnés dans l'initialiseur 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

Wow, C semble être simple, mais même après des années de citant la spécification, il est incroyable de voir comment quelque chose de nouveau peut encore apparaître. Je viens de chercher dans la spécification de la première é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 ... ".

Donc: Tout ce qui n'est pas automatique. Toujours 0 (ou initialisé) initialisé ou non. Auto: complètement initialisé si vous initialisez des éléments du tout, sinon, pas initialisé.

+2

@digitalross: Vous avez tort. Si vous laissez les sections locales complètement non initialisées, elles ne seront pas initialisées. Si vous utilisez un initialiseur et initialisez l'un des champs, chaque champ sera initialisé. –

+0

+1 pour corriger votre réponse :) – AraK

+0

Hé, merci! – DigitalRoss

Questions connexes