名前空間
変種
操作

スカラーの初期化

提供: cppreference.com
< c‎ | language

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

スカラー (整数型 (ブーリアンおよび列挙型も含みます)、浮動小数点型 (複素数および虚数も含みます)、およびポインタ型 (関数へのポインタも含みます) のオブジェクト) に対する初期化子は、単一の式でなければなりません (波括弧で囲っても構いません)。

= expression (1)
= { expression } (2)

式が評価され、そのオブジェクトの型に代入であるかのように変換された後、その値がその初期化中のオブジェクトの初期値になります。

[編集] ノート

代入であるかのような変換に適用されるルールのため、 expression の変換先の型を決定するときは宣言された型の const および volatile 修飾子は無視されます。

初期化子が使用されないときに適用されるルールについては初期化を参照してください。

他のすべての初期化と同様に、静的またはスレッドローカル記憶域期間のオブジェクトを初期化するときは expression定数式でなければなりません。

トップレベルのコンマは次の宣言子の始まりと解釈されるため、 expression では (括弧で囲まれていない) コンマ演算子は使用できません。

浮動小数点型のオブジェクトを初期化するとき、自動記憶域期間を持つオブジェクトの場合は、すべての計算は実行時であるかのように行われ、現在の丸めモードの影響を受け、浮動小数点のエラーは 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; // 列挙もスカラーです。
}


[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.7.9/11 Initialization (p: 140)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.7.8/11 Initialization (p: 126)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 6.5.7 Initialization