これらのステートメントはどのように異なりますか?
- ダブルダミー = 0;
- ダブルダミー = 0.0;
- ダブルダミー = 0.0d;
- ダブルダミー = 0.0D;
これらのステートメントはどのように異なりますか?
簡単なプログラム (0 と 100 の両方を使用して、「特別な」定数と一般的な定数の違いを示す) を試してみると、Sun Java 6 コンパイラは 1 と 2 の両方に対して同じバイトコードを出力します (ケース 3 と 4 は 2 と同じです)。コンパイラに関する限り)。
たとえば、次のようになります。
double x = 100;
double y = 100.0;
コンパイルすると:
0: ldc2_w #2; //double 100.0d
3: dstore_1
4: ldc2_w #2; //double 100.0d
7: dstore_3
ただし、Java 言語仕様には、このコンパイル時の定数式の拡張を保証するものは何もありません。次のような場合には、コンパイル時のナローイングがあります。
byte b = 100;
セクション 5.2で指定されているとおりですが、それはまったく同じではありません。
私よりも鋭い目を持つ人なら、どこかで保証を見つけられるかもしれません...
最初のものについて:
double dummy = 0;
整数リテラル0
は拡大プリミティブ変換を使用して double に変換されます。Java 言語仕様の5.1.2拡大プリミティブ変換を参照してください。これは完全にコンパイラによって行われることに注意してください。生成されるバイトコードには影響しません。
他のものについて:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
これら 3 つはまったく同じ -0.0
で0.0d
あり、リテラルを記述する0.0D
3 つの異なる方法です。JLS の3.10.2 浮動小数点リテラルdouble
を参照してください。
最後の 3 つは同一である必要があります。右側のリテラルはすでに double です。'd' または 'D' は、10 進リテラルがある場合は暗黙的です。
最初のものは、0 が int リテラルであり、double に拡張されるという点で少し異なります。この場合、異なるバイトコードが生成されるかどうかはわかりません。とにかく結果は同じでなければなりません。