47 votes

Pourquoi est-ce valide C

Je suis tombé sur ce code sur reddit. J'aurais pensé que les conversions de type aurait causé cette invalide.

int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 };

Sur clang, je reçois quelques mises en garde sur les éléments excessives et des accolades à un scalaire initialiseur. Mais le contenu de a est [1, 7, 9].

Est-ce réellement légitime, et si elle l'est, quelqu'un pourrait-il expliquer ce qui se passe exactement?

28voto

Carl Norum Points 114072

Les éléments excédentaires sont tout simplement ignorées. Il y a deux parties de 6.7.8 d'Initialisation que vous vous souciez. Tout d'abord, du point 17:

Chaque corset-joint une liste d'initialiseur est associé à un objet courant. Lorsque l'absence de désignations sont présents, les sous-objets de l'objet courant sont initialisés dans l'ordre selon le type de l'objet courant: les éléments du tableau dans l'augmentation de l'indice de l'ordre, de la structure des membres dans la déclaration, et le premier nommé membre d'un syndicat.

Que l'on explique pourquoi vous obtenez 1, 7, et 9 - l'objet en cours est indiqué par ces accolades. Alors pourquoi il ne se soucie pas des figurants, de l'alinéa 20:

... seulement assez d'initialiseurs de la liste sont prises afin de tenir compte des éléments ou des membres de la subaggregate ou le premier membre de l'union; tout en restant initialiseurs sont de gauche à initialiser l'élément suivant ou membre de la somme dont l'actuel subaggregate ou contenus de l'union est partie.

2voto

ouah Points 75311
   int a[3] = { { {1, 2}, {3, 4}, 5, 6 }, {7, 8}, {9}, 10 };
 

est invalide.

Il est invalide pour les mêmes raisons. int b[1] = {1, 2}; n'est pas valide: parce que C99 dit

(C99, 6.7.8p1) "Aucun initialiseur ne doit tenter de fournir une valeur pour un objet non contenu dans l'entité en cours d'initialisation."

Le dernier élément 10 dans a initializer tente de fournir une valeur pour un objet non contenu dans l'entité en cours d'initialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X