定数式
日本語 | 定数式 |
英語 | constant expression |
ふりがな | ていすうしき |
フリガナ | テイスウシキ |
コンパイル時に値が確定している値。
たとえば「int i = 100;」のように整数リテラルを記述した場合、この「100」という値は実行中に変わることがない。
このように、コンパイル時に値が確定し、実行中に変化しない値のことを「定数式」と言う。
定数式には、まずすべてのリテラルが当てはまる。
次に、そのリテラル同士による計算結果が当てはまる。
さらに、「リテラル」もしくは「リテラル同士の計算結果」を格納したfinal変数も当てはまる。特にこれを「定数変数」と呼ぶ。
これらの定数式は、暗黙的なナローイング変換に使用することができる。
たとえば「byte b = 127;」という式で、なぜint型のはずの整数リテラルがbyte型にキャストされるのかというと、コンパイル時に「127」という値が分かっており、byte型のサイズに収まると判断できるため、暗黙的キャストが行われるからである。
また、定数式はcaseに使用することもできる。
caseに使用する値は実行速度を上げるためコンパイル時に値が分かっている必要がある。定数式はその条件を満たすため使用することができる。
たとえば「int i = 100;」のように整数リテラルを記述した場合、この「100」という値は実行中に変わることがない。
このように、コンパイル時に値が確定し、実行中に変化しない値のことを「定数式」と言う。
定数式には、まずすべてのリテラルが当てはまる。
次に、そのリテラル同士による計算結果が当てはまる。
さらに、「リテラル」もしくは「リテラル同士の計算結果」を格納したfinal変数も当てはまる。特にこれを「定数変数」と呼ぶ。
これらの定数式は、暗黙的なナローイング変換に使用することができる。
たとえば「byte b = 127;」という式で、なぜint型のはずの整数リテラルがbyte型にキャストされるのかというと、コンパイル時に「127」という値が分かっており、byte型のサイズに収まると判断できるため、暗黙的キャストが行われるからである。
また、定数式はcaseに使用することもできる。
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 式は定数式でなければなりません
// ※コンパイルエラーの例ここまで
}
}
}
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 式は定数式でなければなりません // ※コンパイルエラーの例ここまで } } }