Initialisation

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Syntaxe de déclaration - Index

Les initialisateurs, ou valeurs d'initialisation, fixent la valeur enregistrée dans un objet (variables, tableaux, structures, etc.). Si vous n'initialisez pas un objet et si celui-ci a une durée statique, sa valeur d'initialisation par défaut sera déterminée comme suit :

  • à zéro s'il s'agit d'un type arithmétique
  • à NULL s'il s'agit d'un type pointeur

Remarque :  En cas de durée de stockage automatique, la valeur est indéterminée.

Syntaxe des initialisateurs


initialisateur
		= expression
		= {liste-initialisateurs} <,>}
		(liste expressions)
liste-initialisateurs
		expression
		liste initialisateurs, expression
		{liste-initialisateurs} <,>}

Règles régissant l'initialisation

  • Le nombre des valeurs d'initialisation dans la liste ne doit pas dépasser le nombre des objets à initialiser.
  • L'élément à initialiser doit être un objet (par exemple, un tableau).
  • Toutes les expressions doivent être constantes si elles apparaissent dans un de ces emplacements (non requis pour C++) :
    • dans une valeur d'initialisation pour un objet à durée statique ;
    • dans une liste de valeurs d'initialisation pour un tableau, une structure ou une union (les expressions utilisant sizeof sont également autorisées).
  • Si une déclaration pour un objet donné a une portée bloc et si l'identificateur est caractérisé par une liaison externe ou interne, cette déclaration ne peut pas avoir de valeur d'initialisation pour l'identificateur.
  • S'il y a moins de valeurs d'initialisation dans une liste entre accolades qu'il n'y a de membres dans la structure, le reste de la structure est initialisé implicitement comme les objets ayant une durée statique.

Les types scalaires sont initialisés avec une expression unique, qui peut éventuellement être placée entre accolades. La valeur initiale de l'objet est celle de l'expression ; les mêmes restrictions que pour le type et les conversions s'appliquent aux affectations uniques.

Pour les unions, les valeurs d'initialisation entre accolades initialisent le membre qui apparaît en premier dans la liste de déclaration de l'union. Pour les structures ou les unions ayant une durée automatique, la valeur d'initialisation doit être, au choix :

  • une liste de valeurs d'initialisation telle que décrite à la rubrique Tableaux, structures et unions.
  • une expression unique avec un type structure ou union compatible. Dans ce cas, la valeur initiale de l'objet est celle de l'expression.

Tableaux, structures et unions

Vous initialisez des tableaux et des structures (au moment de la déclaration, par exemple) avec une liste placée entre accolades contenant des valeurs d'initialisation pour les membres ou les éléments de l'objet en question. Les valeurs d'initialisation sont mentionnées dans l'ordre croissant des membres ou des indices du tableau. Vous initialisez les unions avec une valeur mise entre accolades pour le premier membre de l'union. Par exemple, vous pouvez déclarer un tableau jours, pour compter combien de fois chaque jour de la semaine apparaît dans le mois (en supposant que chaque jour apparaîtra au moins une fois), de la façon suivante :

int jours[7] = { 1, 1, 1, 1, 1, 1, 1 }

Utilisez ces règles pour initialiser les tableaux de caractères et les tableaux de caractères larges :

  • Vous pouvez initialiser des tableaux de type caractère avec une chaîne littérale, éventuellement mise entre accolades. Chaque caractère de la chaîne, y compris le terminateur NULL, initialise les éléments successifs du tableau. Par exemple, vous allez déclarer :
char nom[] = { "Inconnu" };

pour un tableau de huit éléments, qui sont 'I' (pour nom[0]), 'n' (pour nom[1]), etc., jusqu'au caractère de fin.

  • Vous pouvez initialiser un tableau de caractères larges (compatible avec wchar_t) à l'aide d'une chaîne littérale "large", éventuellement placée entre accolades. Comme précédemment, les codes de cette chaîne initialisent successivement tous les éléments du tableau.

Voici un exemple d'initialisation de structure :

struct mystruct {
   int i;
   char str[21];
   double d;
   } s = { 20, "Borland", 3.141 };

Les membres complexes d'une structure, comme des tableaux ou des structures, peuvent être initialisés à l'aide d'expressions adéquates placées entre accolades imbriquées.

Voir aussi