定数式
提供: cppreference.com
いくつかの種類の式は定数式と言います。
目次 |
[編集] プリプロセッサ定数式
#if または #elif の後の式は以下のいずれかの展開されなければなりません。
文字定数は、 #if
式内で評価されたときは、ソース文字集合、実行文字集合、または処理系定義の何らかの他の文字集合で解釈されるかもしれません。
|
(C99以上) |
[編集] 整数定数式
整数定数式は以下のみから構成される式です。
- 代入、インクリメント、デクリメント、関数呼び出し、コンマ以外の演算子 (ただしキャストは算術型から整数型へのキャストのみ)
- 整数定数
- 列挙定数
- 文字定数
- 浮動小数点定数 (ただし直ちに整数型へのキャストの被演算子として使用される場合のみ)
- sizeof 演算子 (ただし被演算子が VLA の場合は除きます) (C99以上)
|
(C11以上) |
整数定数式はコンパイル時に評価されます。 以下の文脈は整数定数式であると判明している式を要求します。
|
(C99以上) |
|
(C11以上) |
[編集] 静的初期化子
静的およびスレッドローカル記憶域期間を持つオブジェクトの初期化子で使用される式は、以下のいずれかの式でなければなりません。
1) 算術定数式、これは以下から構成される任意の算術型の式です。
|
(C11以上) |
2) ヌルポインタ定数 NULL
3) アドレス定数式、これは以下のいずれかです。
4) 何らかの完全オブジェクト型のアドレス定数式に整数定数式を加算または減算したもの
整数定数式と異なり、静的初期化子式はコンパイル時に評価されることは要求されていません。 コンパイラにはそのよ���な初期化子をプログラムのスタート��ップ前に実行される実行可能コードに変換する自由があります。
static int i = 2 || 1 / 0; // i を値 1 に初期化します。
This section is incomplete Reason: other mini-examples |
浮動小数点の静的初期化子の値は実行時に実行される同じ式の値より精度が悪くなることはありませんが、良くなることはあります。
[編集] 浮動小数点定数式
静的初期化子で使用されたものではない浮動小数点型の算術定数式は、必ず、実行時であるかのように評価され、現在の丸めモードの影響を受け (FENV_ACCESS が ON の場合)、 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; // 例外を発生させます。 }
[編集] ノート
式がその型で表現できない値に評価される場合、それは定数式としては使用できません。