Constant expressions
いくつかの種類の式は constant expressions として知られています。
目次 |
プリプロセッサ定数式
#if
または
#elif
に続く式は展開されて
- 演算子 ただし 代入 、 インクリメント、デクリメント 、 関数呼び出し 、または コンマ演算子 を除く。引数がプリプロセッサ定数式であるもの
- 整数定数
- 文字定数
-
特殊プリプロセッサ演算子
defined.
#if
式で評価される文字定数は、ソース文字セット、実行文字セット、またはその他の実装定義の文字セットで解釈される可能性があります。
|
|
(C99以降) |
整数定数式
整数定数式は、以下のもののみで構成される式です。
- 演算子 ( 代入 、 インクリメント・デクリメント 、 関数呼び出し 、または コンマ演算子 を除く)。ただし キャスト演算子 は、sizeof , _Alignof (C11以降) (C23以前) , alignas (C23以降) または typeof/typeof_unqual (C23以降) 演算子のオペランドの一部でない限り、算術型から整数型へのみキャスト可能。
- 整数定数
- 列挙定数
- 文字定数
- 浮動小数点定数 (整数型へのキャストのオペランドとして即座に使用される場合に限る)
-
sizeof演算子 (オペランドがVLAでない場合) (C99以降)
|
(C11以降) |
|
(C23以降) |
整数定数式はコンパイル時に評価されます。以下の文脈では、 整数定数式 として知られる式が必要とされます:
|
(C99以降) |
|
(C11以降) |
|
(C23以降) |
静的初期化子
静的記憶域期間およびスレッドローカル記憶域期間を持つオブジェクトの 初期化子 で使用される式、 または constexpr 記憶クラス指定子で宣言された式は、 (C23以降) 文字列リテラルか、以下のいずれかである可能性のある式でなければなりません
| (C11以降) |
|
(C23以降) |
-
- ヌルポインタ
- lvalue が静的 storage duration を持つオブジェクトまたは関数指示子を指定し、以下のいずれかの方法でポインタに変換されたもの:
-
- 単項アドレス取得演算子の使用による
- 整数定数のポインタへのキャストによる
- 配列からポインタへの、または関数からポインタへの暗黙の conversion による
|
5)
名前付き定数。これは以下のいずれかの識別子である:
.
メンバアクセス演算子を適用する後置式(再帰的であってもよい)。
6)
複合リテラル定数。これは以下のいずれかである:
構造体定数または共用体定数は、それぞれ構造体型または共用体型を持つ名前付き定数または複合リテラル定数である。メンバアクセス演算子
|
(C23以降) |
整数定数式とは異なり、静的初期化子式はコンパイル時に評価される必要はありません。コンパイラはそのような初期化子をプログラム開始前に呼び出される実行可能コードに変換する自由を有します。
static int i = 2 || 1 / 0; // 変数iを値1で初期化
|
このセクションは不完全です
理由:その他のミニ例 |
浮動小数点の静的初期化子の値は、実行時に同じ式を実行した値よりも精度が低くなることは決してありませんが、より良い場合があります。
浮動小数点定数式
静的初期化子で使用されない浮動小数点型の算術定数式は、常に実行時と同様に評価され、 現在の丸めモード の影響を受けます ( FENV_ACCESS が有効な場合)。また、 math_errhandling で指定された通りにエラーを報告します。
void f(void) { #pragma STDC FENV_ACCESS ON static float x = 0.0 / 0.0; // 静的初期化子: 例外を発生させない float w[] = { 0.0 / 0.0 }; // 例外を発生させる float y = 0.0 / 0.0; // 例外を発生させる double z = 0.0 / 0.0; // 例外を発生させる }
注記
式がその型で表現できない値に評価される場合、定数式として使用することはできません。
実装は他の形式の定数式を受け入れる場合があります。しかし、これらの定数式は整数定数式、算術定数式、またはアドレス定数式とは見なされず、したがってこれらの種類の定数式を必要とする文脈では使用できません。例えば、 int arr [ ( int ) + 1.0 ] ; はVLAを宣言します。
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 6.6 定数式 (p: 95-96)
- C17規格 (ISO/IEC 9899:2018):
-
- 6.6 定数式 (p: 76-77)
- C11規格 (ISO/IEC 9899:2011):
-
- 6.6 定数式 (p: 106-107)
- C99規格 (ISO/IEC 9899:1999):
-
- 6.6 定数式 (p: 95-96)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 3.4 定数式
関連項目
|
C++ documentation
for
Constant expressions
|