Skalare Initialisierung
Bei der Initialisierung eines Objekts vom skalaren Typ muss der Initialisierer ein einzelner Ausdruck sein
Der Initialisierer für einen Skalar (ein Objekt vom ganzzahligen Typ einschließlich Boolescher und aufzählbarer Typen, vom Gleitkommatyp einschließlich komplexer und imaginärer Zahlen sowie vom Zeigertyp einschließlich Zeiger auf Funktion) muss ein einzelner Ausdruck sein, der optional in geschweifte Klammern eingeschlossen ist, oder ein leerer Initialisierer(seit C23)
= Ausdruck |
(1) | ||||||||
= { Ausdruck } |
(2) | ||||||||
= { }
|
(3) | (seit C23) | |||||||
[bearbeiten] Hinweise
Aufgrund der Regeln für die Konvertierung wie durch Zuweisung werden const- und volatile-Qualifizierer des deklarierten Typs ignoriert, wenn bestimmt wird, in welchen Typ der Ausdruck konvertiert werden soll.
Siehe Initialisierung für die Regeln, die gelten, wenn kein Initialisierer verwendet wird.
Wie bei allen anderen Initialisierungen muss der Ausdruck ein konstanter Ausdruck sein, wenn Objekte mit statischer oder Thread-lokaler Speicherdauer initialisiert werden.
Der Ausdruck kann kein Kommaoperator sein (es sei denn, er ist in Klammern gesetzt), da das oberste Komma als Beginn des nächsten Deklarators interpretiert würde.
Bei der Initialisierung von Objekten vom Fließkommatyp erfolgen alle Berechnungen für Objekte mit automatischer Speicherdauer wie zur Laufzeit und werden durch die aktuelle Rundung beeinflusst; Fließkommafehler werden wie in math_errhandling angegeben gemeldet. Für Objekte mit statischer und Thread-lokaler Speicherdauer erfolgen Berechnungen wie zur Kompilierzeit, und es werden keine Ausnahmen ausgelöst.
void f(void) { #pragma STDC FENV_ACCESS ON static float v = 1.1e75; // does not raise exceptions: static init float u[] = { 1.1e75 }; // raises FE_INEXACT float w = 1.1e75; // raises FE_INEXACT double x = 1.1e75; // may raise FE_INEXACT (depends on FLT_EVAL_METHOD) float y = 1.1e75f; // may raise FE_INEXACT (depends on FLT_EVAL_METHOD) long double z = 1.1e75; // does not raise exceptions (conversion is exact) }
[bearbeiten] Beispiel
#include <stdbool.h> int main(void) { bool b = true; const double d = 3.14; int k = 3.15; // conversion from double to int int n = {12}, // optional braces *p = &n, // non-constant expression OK for automatic variable (*fp)(void) = main; enum {RED, BLUE} e = RED; // enumerations are scalar types as well }
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.7.9/11 Initialisierung (S. 101)
- C11-Standard (ISO/IEC 9899:2011)
- 6.7.9/11 Initialisierung (S. 140)
- C99-Standard (ISO/IEC 9899:1999)
- 6.7.8/11 Initialisierung (S. 126)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 6.5.7 Initialization