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量通过扩展原始转换转换为双精度,请参阅Java 语言规范中的5.1.2扩展原始转换。请注意,这完全由编译器完成,它对生成的字节码没有任何影响。

对于其他人:

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

这三个是完全相同的 - 0.00.0d并且0.0D只是三种不同的文字书写方式double。请参阅JLS 中的3.10.2 浮点文字。

于 2009-09-18T10:36:46.843 回答
3

最后3个应该是相同的。右侧的文字已经是双精度数了。当您有十进制文字时,'d' 或 'D' 是隐含的。

第一个略有不同,因为 0 是一个 int 字面量,它将被扩大到一个双精度值。我不知道在这种情况下是否会产生不同的字节码;无论如何,结果应该是相同的。

于 2009-09-18T08:59:11.957 回答