スカラ型の初期化
From cppreference.com
「初期化」を「スカラー型」のオブジェクトに対して行う場合、初期化子は単一の式である必要があります。
スカラー(ブール型および列挙型を含む整数型、複素数型および虚数型を含む浮動小数点型、関数へのポインタを含むポインタ型)の初期化子は、単一の式である必要があり、オプションで波括弧で囲むことができます(C23以降(C23以降))、または空の初期化子です。
= expression |
(1) | ||||||||
= { 式 } |
(2) | ||||||||
= { }
|
(3) | (C23以降) | |||||||
1,2) 式は評価され、その値は、オブジェクトの型への代入としての変換の後、初期化されるオブジェクトの初期値となります。
3) オブジェクトは空初期化されます。つまり、算術型または列挙型のオブジェクトの場合は数値のゼロ、ポインタ型のオブジェクトの場合はヌルポインタ値で初期化されます。
[編集] 注釈
代入としての変換に適用される規則のため、宣言された型のconstおよびvolatile修飾子は、式をどの型に変換するかを決定する際には無視されます。
初期化子が使用されない場合に適用される規則については、初期化を参照してください。
他のすべての初期化と同様に、静的またはスレッドローカルな記憶域期間を持つオブジェクトを初期化する場合、式は定数式である必要があります。
式は、トップレベルのコンマが次の宣言子(declarator)の開始として解釈される可能性があるため、カンマ演算子(括弧で囲まれていない場合)にすることはできません。
浮動小数点型のオブジェクトを初期化する場合、自動記憶域期間を持つオブジェクトのすべての計算は、実行時に行われるかのように実行され、現在の丸めの影響を受けます。浮動小数点エラーは、math_errhandlingで指定されたとおりに報告されます。静的およびスレッドローカルな記憶域期間を持つオブジェクトの場合、計算はコンパイル時に行われるかのように実行され、例外は発生しません。
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) }
[編集] 例
このコードを実行
#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 }
[編集] 参照
- 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 Initialization