Namespaces
Variants

Scalar initialization

From cppreference.net

初期化 時に スカラ型 のオブジェクトを初期化する場合、初期化子は単一の式でなければなりません

スカラー(整数型(ブール型および列挙型を含む)、浮動小数点型(複素数型および虚数型を含む)、ポインタ型(関数ポインタを含む)のオブジェクト)の初期化子は、単一の式でなければならず、オプションで中括弧で囲むことができます 、または空の初期化子 (C23以降) :

= (1)
= { } (2)
= { } (3) (C23以降)
1,2) 式が評価され、その値がオブジェクトの型への 代入による変換 を経て、初期化されるオブジェクトの初期値となる。
3) オブジェクトは empty-initialized されます。すなわち、算術型または列挙型のオブジェクトに対しては数値のゼロに、ポインタ型のオブジェクトに対してはヌルポインタ値に初期化されます。

注記

代入による変換に適用される規則のため、宣言された型の const および volatile 修飾子は、 expression をどの型に変換するかを決定する際に無視されます。

初期化子が使用されない場合に適用される規則については、 initialization を参照してください。

他のすべての初期化と同様に、 expression は、 静的またはスレッドローカルの storage duration を持つオブジェクトを初期化する場合、 constant expression でなければなりません。

この expression comma operator であってはなりません(括弧で囲まれている場合を除く)。なぜなら、トップレベルのカンマは次の宣言子の開始として解釈されるためです。

浮動小数点型のオブジェクトを初期化する際、自動 記憶域期間 を持つオブジェクトのすべての計算は、実行時に行われるかのように処理され、 現在の丸めモード の影響を受けます。浮動小数点エラーは math_errhandling で指定された通りに報告されます。静的記憶域期間およびスレッドローカル記憶域期間を持つオブジェクトの場合、計算はコンパイル時に行われるかのように処理され、例外は発生しません:

void f(void)
{
#pragma STDC FENV_ACCESS ON
    static float v = 1.1e75; // 例外を発生させない: 静的初期化
    float u[] = { 1.1e75 }; // FE_INEXACTを発生
    float w = 1.1e75;       // FE_INEXACTを発生
    double x = 1.1e75; // FE_INEXACTを発生する可能性あり (FLT_EVAL_METHODに依存)
    float y = 1.1e75f; // FE_INEXACTを発生する可能性あり (FLT_EVAL_METHODに依存)
    long double z = 1.1e75; // 例外を発生させない (変換が正確)
}

#include <stdbool.h>
int main(void)
{
    bool b = true;
    const double d = 3.14;
    int k = 3.15; // doubleからintへの変換
    int n = {12}, // オプションの波括弧
       *p = &n,   // 自動変数では非定数式が許可される
       (*fp)(void) = main;
    enum {RED, BLUE} e = RED; // 列挙型もスカラ型である
}

参考文献

  • C17規格 (ISO/IEC 9899:2018):
  • 6.7.9/11 初期化 (p: 101)
  • C11規格 (ISO/IEC 9899:2011):
  • 6.7.9/11 初期化 (p: 140)
  • C99規格 (ISO/IEC 9899:1999):
  • 6.7.8/11 初期化 (p: 126)
  • C89/C90標準 (ISO/IEC 9899:1990):
  • 6.5.7 初期化