スカラーの初期化
提供: cppreference.com
スカラー型のオブジェクトを初期化するときは、初期化子は単一の式でなければなりません。
スカラー (整数型 (ブーリアンおよび列挙型も含みます)、浮動小数点型 (複素数および虚数も含みます)、およびポインタ型 (関数へのポインタも含みます) のオブジェクト) に対する初期化子は、単一の式でなければなりません (波括弧で囲っても構いません)。
= 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; // 例外を発生しません (変換は正確です)。 }
[編集] 例
Run this code
#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