这些陈述在哪些方面有所不同?
答案 0 :(得分:23)
尝试了一个简单的程序(同时使用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;
在section 5.2中指定,但这并不完全相同。
也许眼睛比我更敏锐的人可以在某处找到保证...
答案 1 :(得分:14)
第一个:
double dummy = 0;
整数文字0
通过扩展原语转换转换为double,请参阅Java语言规范中的5.1.2 Widening Primitive Conversion。请注意,这完全由编译器完成,它对生成的字节码没有任何影响。
对于其他人:
double dummy = 0.0;
double dummy = 0.0d;
double dummy = 0.0D;
这三个完全相同 - 0.0
,0.0d
和0.0D
只是编写double
字面的三种不同方式。请参阅JLS中的3.10.2 Floating-Point Literals。
答案 2 :(得分:3)
最后3个应该是相同的。右侧的文字已经是双重的。当你有一个十进制文字时,'d'或'D'是隐含的。
第一个略有不同,因为0是一个int文字,它将被加宽为double。我不知道在这种情况下是否会产生不同的字节代码;无论如何,结果应该是相同的。
答案 3 :(得分:-5)
for Java我不确切知道,在C中,如果你最后省略这个D会非常危险,因为它不会改变高位字节,这可能会影响你的变量就是你实际上没有放入的数字在!
在Java中,我有一个非常大的问题,即实例化BigDecimal - 新的BigDecimal(0)和新的bigDecimal(0L)不是一回事,如果你将代码从Java 1.4迁移到Java 1.5,你会感觉到它。不知道为什么他们对此很草率,也许他们不得不这样做。