Namensräume
Varianten
Aktionen

Skalare Initialisierung

Von cppreference.com
< c‎ | Sprache

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)
1,2) Der Ausdruck wird ausgewertet, und sein Wert wird nach Konvertierung wie durch Zuweisung in den Typ des Objekts zum Anfangswert des zu initialisierenden Objekts.
3) Das Objekt wird leer initialisiert, d.h. mit numerischem Null für ein Objekt vom arithmetischen oder Enumerationstyp oder mit einem Nullzeigerwert für ein Objekt vom Zeigertyp.

[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