Scalar initialization
Lors de l'initialisation d'un objet de type scalaire , l'initialiseur doit être une expression unique
L'initialiseur pour un scalaire (un objet de type entier incluant les booléens et les types énumérés, type flottant incluant les complexes et imaginaires, et type pointeur incluant les pointeurs vers des fonctions) doit être une expression unique, optionnellement entre accolades , ou un initialiseur vide (depuis C23) :
=
expression
|
(1) | ||||||||
=
{
expression
}
|
(2) | ||||||||
=
{
}
|
(3) | (depuis C23) | |||||||
Notes
En raison des règles qui s'appliquent aux conversions comme par affectation,
const
et
volatile
qualificateurs sur le type déclaré sont ignorés lors de la détermination du type vers lequel convertir l'
expression
.
Voir l'initialisation pour les règles qui s'appliquent lorsqu'aucun initialiseur n'est utilisé.
Comme pour toutes les autres initialisations, expression doit être une expression constante lors de l'initialisation d'objets de durée de stockage statique ou thread-local.
L' expression ne peut pas être un opérateur virgule (sauf si elle est entre parenthèses) car la virgule au niveau supérieur serait interprétée comme le début du déclarateur suivant.
Lors de l'initialisation d'objets de type virgule flottante, tous les calculs pour les objets ayant une durée de stockage automatique sont effectués comme si c'était au moment de l'exécution et sont affectés par l' arrondi courant ; les erreurs en virgule flottante sont signalées comme spécifié dans math_errhandling . Pour les objets ayant une durée de stockage statique et thread-local, les calculs sont effectués comme si c'était au moment de la compilation, et aucune exception n'est levée :
void f(void) { #pragma STDC FENV_ACCESS ON static float v = 1.1e75; // ne lève pas d'exceptions : initialisation statique float u[] = { 1.1e75 }; // lève FE_INEXACT float w = 1.1e75; // lève FE_INEXACT double x = 1.1e75; // peut lever FE_INEXACT (dépend de FLT_EVAL_METHOD) float y = 1.1e75f; // peut lever FE_INEXACT (dépend de FLT_EVAL_METHOD) long double z = 1.1e75; // ne lève pas d'exceptions (la conversion est exacte) }
Exemple
#include <stdbool.h> int main(void) { bool b = true; const double d = 3.14; int k = 3.15; // conversion de double en int int n = {12}, // accolades optionnelles *p = &n, // expression non constante acceptée pour variable automatique (*fp)(void) = main; enum {RED, BLUE} e = RED; // les énumérations sont également des types scalaires }
Références
- Norme C17 (ISO/CEI 9899:2018) :
-
- 6.7.9/11 Initialisation (p: 101)
- Norme C11 (ISO/IEC 9899:2011):
-
- 6.7.9/11 Initialisation (p: 140)
- Norme C99 (ISO/IEC 9899:1999) :
-
- 6.7.8/11 Initialisation (p: 126)
- Norme C89/C90 (ISO/IEC 9899:1990) :
-
- 6.5.7 Initialization