这些陈述有何不同?
- 双假人= 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
量通过扩展原始转换转换为双精度,请参阅Java 语言规范中的5.1.2扩展原始转换。请注意,这完全由编译器完成,它对生成的字节码没有任何影响。
对于其他人:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
这三个是完全相同的 - 0.0
,0.0d
并且0.0D
只是三种不同的文字书写方式double
。请参阅JLS 中的3.10.2 浮点文字。
最后3个应该是相同的。右侧的文字已经是双精度数了。当您有十进制文字时,'d' 或 'D' 是隐含的。
第一个略有不同,因为 0 是一个 int 字面量,它将被扩大到一个双精度值。我不知道在这种情况下是否会产生不同的字节码;无论如何,结果应该是相同的。