定数式

編集

プログラミングにおいて、定数式は非常に重要な役割を担っています。定数式とは、その名の通り、コンパイル時に値が確定する式のことを指します。C言語では、定数式は様々な場面で用いられます。例えば、配列のサイズを指定する際や、enum型の値を初期化する際などがその具体例です。

定数式は以下の構文規則に従って記述されます。

constant-expression: 
    conditional-expression

つまり、条件式が定数式として使用可能であることを意味しています。しかしながら、条件式の形を取っている式が必ずしも定数式とは限りません。なぜなら、定数式には幾つかの制約が課されているからです。

第一に、定数式中には代入演算子(=)、インクリメント演算子(++)、デクリメント演算子(--)、関数呼び出し、コンマ演算子(,)を含めてはいけません。ただし、評価されない副式内に含まれる場合は例外とされます。

第二に、定数式が評価された結果は、その式の型の値の範囲内に収まる必要があります。例えば、unsigned int型の定数式なら、0から4294967295の範囲内の値を取らなければいけません。

定数式は主に次の3種類に大別することができます。

整数定数式

編集

整数定数式とは、整数型の定数式のことを指します。具体的には、整数定数、整数型の列挙子定数、整数型のconstexprオブジェクト、サイズオフ演算子の整数結果、アライメント演算子などを含む式が該当します。整数定数式のキャスト演算子は、算術型から整数型への変換のみ許可されます。

算術定数式

編集

算術定数式とは、整数型や浮動小数点型の定数式を指します。具体的には、整数定数、浮動小数点数定数、算術型のconstexprオブジェクト、文字定数、サイズオフ演算子の整数結果、アライメント演算子などを含む式が該当します。算術定数式のキャスト演算子は、算術型から算術型への変換のみ許可されます。

アドレス定数

編集

アドレス定数とは、NULLポインタ、静的記憶期間オブジェクトを指す左辺値式、関数指標を指すポインタなどを指します。これらはアドレス演算子(&)、整数からポインタへのキャスト、配列型や関数型の式から暗に生成されます。アドレス定数の生成には[]演算子、->演算子、&演算子、*演算子、ポインタキャストが使用できますが、オブジェクトの値自体を参照してはいけません。