J'essaie d'initialiser un tableau de bools comme: mais quand je le débogé, je ne vois que le premier élément de la matrice initialisée, les autres sont faux. Comment cela peut-il être si? J'utilise QT sur Ubuntu 10 et l'initialisation est effectuée sur un tableau local à l'intérieur d'une méthode. P> OK merci pour vos réponses. P> P>
5 Réponses :
Parce que vous avez explicitement initialisé uniquement le premier élément de la matrice, seul le premier élément est initialisé et que les restants ne sont pas. P>
Le reste est i> initialisé à une valeur par défaut de 0. C'est pourquoi il est sûr d'utiliser int i [10] = {0}; code> à 0-initialiser un tableau.
En fait, tous les éléments sont initialisés. L'État standard indique que tous les éléments restants sont définis sur 0.
@meagar Comment pouvez-vous dire que "int i [10] = {0}" fait autre chose que de régler 0 sur le premier élément.
@yan je suis à peu près sûr qu'il peut dire que parce que c'est ainsi que la langue est définie au travail.
@Tyler Mchenry a l'air d'avoir un peu étrange de dire que la seule fois où vous pouvez initialiser tous les éléments d'un tableau de cette façon, c'est lorsque vous les intentalez à la valeur déjà utilisée par défaut, ce qui a un effet null, mais si vous dites que c'est comment La langue est définie, je vous crois.
Mais @yan, c'est pas i> déjà utilisé par défaut. Si vous n'aviez donné aucun initialiseur du tout, le tableau serait (généralement) être inaitalisé i>. La matrice pourrait contenir un mélange de true code> et
false code>, ainsi que des valeurs qui ne sont pas valides
BOOL code> valeurs du tout. Si vous initialisez n'importe quel i> des éléments, C ++ fournit un sténographique i> pour donner des valeurs par défaut aux éléments restants. Ce n'est pas un effet nul. Je pense qu'il y a un mérite de travailler la langue de la façon dont vous (et moi, une fois) pensais, mais il est trop tard pour le changer maintenant. Le code de côté repose déjà sur le comportement actuel.
Parce que c'est la façon dont l'initialisation de la matrice fonctionne en C ++. Si vous ne donnez pas explicitement une valeur pour chaque élément, cet élément par défaut à zéro (ou, ici, false) Notez que P> bool FcpNumberIsOk[MAX_FCPS];
Quand était-ce que la deuxième version est initialisée? Je ne pensais que si vous avez explicitement par défaut - initialiser la classe / structure contenant?
@JDV, si vous définissez la variable comme une durée de stockage statique (statique locale / classe, variables d'espace de noms de noms), il est zéro initialisé au début du programme avant tout ce qui a lieu. Voir Qu'est-ce que le retour principal? .
Ceci est le comportement attendu. Le premier élément est initialisé à la valeur spécifiée et le reste est initialisé à la valeur par défaut de 0:
Utilisation de cette syntaxe, vous n'initialisez que le premier élément (avec la valeur de votre appartement et d'autres d'obtenir par défaut - un [faux]), mais pas d'autres. Vous devez utiliser une matrice et un memset Int ou pour une boucle pour initialiser tous les éléments. P>
En fait, tous les éléments sont initialisés. L'État standard indique que tous les éléments restants sont définis sur 0.
Eh bien, je voulais dire ça. Ok, mon erreur.
Memset CODE> fonctionnera, la plupart du temps, mais n'est pas portable.
:: STD :: Remplir Code> est bien meilleur et fonctionnera sur un tableau code> bool code> et sur un bon compilateur, il sera tout aussi efficace.
J'ai eu une mauvaise expérience avec STD :: Copier avec des vecteurs sur MSVC. Donc, pour l'efficacité, j'utilise des fonctions MEMCY et MEMSET. Les sont 100% rapides. Mais oui, je suis toujours vraiment soigné avec eux.
Vous avez mal compris. Il semble que vous puissiez que tout élément inhabituel soit initialisé à la même valeur que la dernière valeur explicitement initialisée. La dernière valeur que vous avez mentionnée était Ce n'est pas comme ça que ça marche. Tous les éléments inhabituels sont initialisés par défaut, qui pour pour définir tous les éléments sur true code>, de sorte que tous les éléments supplémentaires seraient initialisés à
vrai code>. J'ai eu une fois cette même croyance, mais j'ai vite appris autrement.
bool code> signifie
false code>. P>
vrai code>, Essayez quelque chose comme
std :: Fill_n code>: p>