名前空間
変種
操作

定数式

提供: cppreference.com
< c‎ | language

いくつかの種類の式は定数式と言います。

目次

[編集] プリプロセッサ定数式

#if または #elif の後の式は以下のいずれかの展開されなければなりません。

文字定数は、 #if 式内で評価されたときは、ソース文字集合、実行文字集合、または処理系定義の何らかの他の文字集合で解釈されるかもしれません。

#if 式内の整数算術は、符号付き型の場合は intmax_t、符号なし型の場合は uintmax_t の意味論を用いて行われます。

(C99以上)

[編集] 整数定数式

整数定数式は以下のみから構成される式です。

(C11以上)

整数定数式はコンパイル時に評価されます。 以下の文脈は整数定数式であると判明している式を要求します。

(C99以上)
  • _Static_assert の第1引数
  • _Alignas の整数引数
(C11以上)

[編集] 静的初期化子

静的およびスレッドローカル記憶域期間を持つオブジェクトの初期化子で使用される式は、以下のいずれかの式でなければなりません。

1) 算術定数式、これは以下から構成される任意の算術型の式です。
(C11以上)
2) ヌルポインタ定数 NULL
3) アドレス定数式、これは以下のいずれかです。
  • ヌルポインタ
  • 以下のいずれかによって変換された、静的記憶域期間のオブジェクトを指示する左辺値または関数指示子
  • 単項アドレス取得演算子
  • 整数定数からポインタへのキャスト
  • 配列からポインタまたは関数からポインタへの暗黙の変換
4) 何らかの完全オブジェクト型のアドレス定数式整数定数式を加算または減算したもの

整数定数式と異なり、静的初期化子式はコンパイル時に評価されることは要求されていません。 コンパイラにはそのよ���な初期化子をプログラムのスタート��ップ前に実行される実行可能コードに変換する自由があります。

static int i = 2 || 1 / 0; // i を値 1 に初期化します。

浮動小数点の静的初期化子の値は実行時に実行される同じ式の値より精度が悪くなることはありませんが、良くなることはあります。

[編集] 浮動小数点定数式

静的初期化子で使用されたものではない浮動小数点型の算術定数式は、必ず、実行時であるかのように評価され、現在の丸めモードの影響を受け (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; // 例外を発生させます。
}

[編集] ノート

式がその型で表現できない値に評価される場合、それは定数式としては使用できません。

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.6 Constant expressions (p: 106-107)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.6 Constant expressions (p: 95-96)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.4 CONSTANT EXPRESSIONS

[編集] 関連項目

定数式C++リファレンス