JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 定数式とは

定数式

日本語 定数式
英語 constant expression
ふりがな ていすうしき
フリガナ テイスウシキ

解説

コンパイル時に値が確定している値。
 
たとえば「int i = 100;」のように整数リテラルを記述した場合、この「100」という値は実中に変わることがない。
このように、コンパイル時に値が確定し、実中に変化しない値のことを「定数式」と言う。

定数式には、まずすべてのリテラルが当てはまる。
次に、そのリテラル同士による計算結果が当てはまる。
さらに、「リテラル」もしくは「リテラル同士の計算結果」を格納したfinal変数も当てはまる。特にこれを「定数変数」と呼ぶ。
 
これらの定数式は、暗黙的ナローイング変換に使用することができる。
たとえば「byte b = 127;」という式で、なぜintのはずの整数リテラルbyteキャストされるのかというと、コンパイル時に「127」という値が分かっており、byteのサイズに収まると判断できるため、暗黙的キャストわれるからである。

また、定数式はcaseに使用することもできる。
caseに使用する値は実速度を上げるためコンパイル時に値が分かっている必要がある。定数式はその条件を満たすため使用することができる。

参考サイト

  • (参考サイトはありません)

(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // たとえば整数リテラルは定数式です。
        // 以下の「100」は整数リテラルなので定数式です。
        int i1 = 100;
        System.out.println( i1 );
        // 100

        // また、リテラル同士の計算結果も定数式です。
        int i2 = 100 + 200;
        System.out.println( i2 );
        // 300

        // リテラル、もしくはリテラル同士の計算結果
        // を格納したfinal変数も定数式です。
        final int INT3 = 300;
        System.out.println( INT3 );
        // 300

        // 定数式はコンパイル時に値が確定しているので、
        // 代入時に「変数に入りきるか」を判定してくれます。
        // たとえば、以下の「127」は整数リテラルなので
        // int型ですが、同時に定数式でもあり、コンパイル時に
        // 「byte型に収まる値だ」と分かるので、byte型に
        // 暗黙的キャストされます。
        byte btOK1 = 127;
        System.out.println( btOK1 );
        // 127

        // これが「128」だとコンパイル時に「byte型に
        // 収まらない値だ」と分かってしまってコンパイルエラー
        // になります。
        // ※コンパイルエラーの例
        // byte btNG1 = 128;
        // ※エラーメッセージ
        // 型の不一致: int から byte には変換できません
        // ※コンパイルエラーの例ここまで

        // この暗黙的なナローイング変換は、定数式なら
        // すべて可能です。たとえばリテラル同士の計算結果とか。
        byte btOK2 = 126 + 1;
        System.out.println( btOK2 );
        // 127

        // リテラル、もしくはリテラル同士の計算結果を格納した
        // final変数も同様です。
        final int INT2 = 126 + 1;
        byte btOK3 = INT2;
        System.out.println( btOK3 );
        // 127

        // final変数ならなんでも定数式になるわけではありません。
        // リテラル、もしくはリテラル同士の計算結果を格納して
        // いないfinal変数は定数式になりません。
        int i4 = 127;
        final int INT4 = i4;
        // ※コンパイルエラーの例
        // byte btOK4 = INT4;
        // ※エラーメッセージ
        // 型の不一致: int から byte には変換できません
        // ※コンパイルエラーの例ここまで

        // 定数式はswitchのcaseに使用することもできます。
        int i5 = 500;
        final int INT5 = 500;
        switch( i5 )
        {
        // caseに定数式INT5を使用します。
        //     ↓
        case INT5:
            System.out.println( i5 );
            // 500

        // 定数式ではないfinal変数は使用できません。
        // ※コンパイルエラーの例
        // case INT4:
        // ※エラーメッセージ
        // case 式は定数式でなければなりません
        // ※コンパイルエラーの例ここまで
        }
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // たとえば整数リテラルは定数式です。
        // 以下の「100」は整数リテラルなので定数式です。
        int i1 = 100;
        System.out.println( i1 );
        // 100

        // また、リテラル同士の計算結果も定数式です。
        int i2 = 100 + 200;
        System.out.println( i2 );
        // 300

        // リテラル、もしくはリテラル同士の計算結果
        // を格納したfinal変数も定数式です。
        final int INT3 = 300;
        System.out.println( INT3 );
        // 300

        // 定数式はコンパイル時に値が確定しているので、
        // 代入時に「変数に入りきるか」を判定してくれます。
        // たとえば、以下の「127」は整数リテラルなので
        // int型ですが、同時に定数式でもあり、コンパイル時に
        // 「byte型に収まる値だ」と分かるので、byte型に
        // 暗黙的キャストされます。
        byte btOK1 = 127;
        System.out.println( btOK1 );
        // 127

        // これが「128」だとコンパイル時に「byte型に
        // 収まらない値だ」と分かってしまってコンパイルエラー
        // になります。
        // ※コンパイルエラーの例
        // byte btNG1 = 128;
        // ※エラーメッセージ
        // 型の不一致: int から byte には変換できません
        // ※コンパイルエラーの例ここまで

        // この暗黙的なナローイング変換は、定数式なら
        // すべて可能です。たとえばリテラル同士の計算結果とか。
        byte btOK2 = 126 + 1;
        System.out.println( btOK2 );
        // 127

        // リテラル、もしくはリテラル同士の計算結果を格納した
        // final変数も同様です。
        final int INT2 = 126 + 1;
        byte btOK3 = INT2;
        System.out.println( btOK3 );
        // 127

        // final変数ならなんでも定数式になるわけではありません。
        // リテラル、もしくはリテラル同士の計算結果を格納して
        // いないfinal変数は定数式になりません。
        int i4 = 127;
        final int INT4 = i4;
        // ※コンパイルエラーの例
        // byte btOK4 = INT4;
        // ※エラーメッセージ
        // 型の不一致: int から byte には変換できません
        // ※コンパイルエラーの例ここまで

        // 定数式はswitchのcaseに使用することもできます。
        int i5 = 500;
        final int INT5 = 500;
        switch( i5 )
        {
        // caseに定数式INT5を使用します。
        //     ↓
        case INT5:
            System.out.println( i5 );
            // 500

        // 定数式ではないfinal変数は使用できません。
        // ※コンパイルエラーの例
        // case INT4:
        // ※エラーメッセージ
        // case 式は定数式でなければなりません
        // ※コンパイルエラーの例ここまで
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2010/04/08
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。