36

これらのステートメントはどのように異なりますか?

  1. ダブルダミー = 0;
  2. ダブルダミー = 0.0;
  3. ダブルダミー = 0.0d;
  4. ダブルダミー = 0.0D;
4

3 に答える 3

27

簡単なプログラム (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で指定されているとおりですが、それはまったく同じではありません。

私よりも鋭い目を持つ人なら、どこかで保証を見つけられるかもしれません...

于 2009-09-18T09:25:27.123 に答える
18

最初のものについて:

double dummy = 0;

整数リテラル0は拡大プリミティブ変換を使用して double に変換されます。Java 言語仕様の5.1.2拡大プリミティブ変換を参照してください。これは完全にコンパイラによって行われることに注意してください。生成されるバイトコードには影響しません。

他のものについて:

double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;

これら 3 つはまったく同じ -0.00.0dあり、リテラルを記述する0.0D3 つの異なる方法です。JLS の3.10.2 浮動小数点リテラルdoubleを参照してください。

于 2009-09-18T10:36:46.843 に答える
3

最後の 3 つは同一である必要があります。右側のリテラルはすでに double です。'd' または 'D' は、10 進リテラルがある場合は暗黙的です。

最初のものは、0 が int リテラルであり、double に拡張されるという点で少し異なります。この場合、異なるバイトコードが生成されるかどうかはわかりません。とにかく結果は同じでなければなりません。

于 2009-09-18T08:59:11.957 に答える